Bonjour,
Ce post est destiné aux fans de prêt ou de loin du framework PHP CodeIgniter (open source). Maintenu jusqu'à sa version 2 par l'équipe de Rick Ellis de la société EllisLab, le framework a été cédé à une équipe universitaire de la BCIT (British Columbia Institute of Technology). La version 3.0.0 est sortie le 24 avril 2015 après 3 RC (Release Candidate) et la version 4 en 4.0.0-dev Milestone 1 (2 autres versions sont prévues dans la roadmap) le 25 juin 2016. Ce genre de version n'est évidement pas destiné à la mise en production mais à des fins de tests en local. Cette dernière monture se veut assez différente que la précédente mais surtout 100% compatible avec PHP 7.
Serveur PHP 7 avec Docker sur Linux
Ces instructions ont été réalisé sur Linux Mint 17.3 (cat etc/linuxmint/info
) avec Docker en version 1.12.0 (docker version
).
Créez un répertoire avec un fichier "Dockerfile" (touch Dockerfile
) et un dossier vide "www" (mkdir www
). Je vous conseille de créer (à la racine du répertoire), un fichier "index.php" pour afficher les données relatives à PHP avec la fonction phpinfo()
.
1 | <?php echo phpinfo(); ?> |
Le Dockerfile
Dans le contenu du Dockerfile, on spécifie les instructions propre à notre futur serveur afin d'avoir MySQLi et Mcrypt.
1 2 3 4 5 6 7 8 9 10 11 | # Image FROM php:7.0.9-apache # MAJ des paquets RUN apt-get update && apt-get install -y libmcrypt-dev # Installation des modules PHP RUN docker-php-ext-install mysqli mcrypt # Activation du module d'URL Rewriting RUN a2enmod rewrite |
Dans le terminal, à la racine de votre projet (au même niveau que votre Dockerfile) exécutez les 2 commandes ci-dessous afin de créer le container :
-
Téléchargement et installation de l'image "php:7.0.9-apache" pour créer l'image "php-apache" :
sudo docker build -t php-apache .
; -
Création du docker "php-dev" automatiquement "up" sur le port 80 :
sudo docker run -d -p 80:80 --name php-dev -v $(pwd)/www/:/var/www/html php-apache
.
L'URL de votre serveur PHP est accessible via http://localhost et les logs du serveur sont disponibles avec sudo docker logs php-dev
.
Le dossier "www"
Dans votre terminal, allez dans ce dossier cd www
et clonez le dépo Github de CodeIgniter 4 avec git clone https://github.com/bcit-ci/CodeIgniter4.git
.
Dans votre navigateur, rendez-vous sur http://localhost/CodeIgniter4/public
Configuration de MySQL
Pour faire fonctionner MySQL (installé sur votre machine en local) depuis Docker, créez un nouvel utilisateur avec tous les privilèges accordés.
1 2 3 4 | mysql -u root -p USE mysql; INSERT INTO user(Host, User, Password) VALUES('172.17.0.2','docker',PASSWORD('docker')); GRANT ALL PRIVILEGES ON *.* TO docker@172.17.0.2 IDENTIFIED BY 'docker' WITH GRANT OPTION; |
Changez également la configuration de votre serveur MySQL dans le fichier vim /etc/mysql/my.cnf
:
- Changez la valeur de "bind-address = votre_adresse_ip_locale" ;
- Commentez la ligne "#skip-external-locking".
Pour prendre en compte ces changements, redémarrez votre serveur avec sudo service mysql restart
.
Creez un fichier "db.php" à la racine du dossier "www" pour tester la connexion au serveur.
1 2 3 4 5 6 7 8 9 10 11 | <?php $server = "votre_adresse_ip_locale"; $username = "docker"; $password = "docker"; $conn = new mysqli($server, $username, $password); if ($conn->connect_error) { die("Problème de connexion: " . $conn->connect_error); } echo "Connexion effectuée :)"; |
A la (re)découverte du framework
Quelques nouveautés, principalement les plus visibles car il y en d'autres (disparition du fichier "config.php", librairie HTTP Responses, etc…) et il y en aura d'autres dans les 2 prochaines versions "dev".
Nouvelle barre de debug
Sur la page d'accueil, dans le header, on peut voir une nouvelle barre de débug. Elle est affichée car CodeIgniter est en mode "developpement" et non en "production" (define('CI_DEBUG', 1);
dans APPPATH/Config/Boot/development.php
).
En ce qui concerne les logs, allez dans le fichier "Config/Logger.php" et changez l'option de la valeur $threshold
à 9
. Les fichiers de logs sont enregistrés dans le dossier "writable/logs."
Remarque : si vous avez une erreur avec fopen
et le message d'erreur failed to open stream: Permission denied
changez le CHMOD du répertoire "logs" à 777 sudo chmod -R 777 /writable/logs/
.
Apparition du namespace
Dans le contrôleur par défaut il y a un namespace
.
1 2 3 4 5 6 7 8 9 | <?php namespace App\Controllers; class Home extends \CodeIgniter\Controller { public function index() { return view('welcome_message'); } } |
Alors que dans la version 3, il n'y en a pas. Petit changement également lors de la déclaration du nom de la classe au niveau du extends \CodeIgniter\Controller
au lieu de CI_Controller
dans la version précédente (idem pour les modèles avec class MonModele extends \CodeIgniter\Model
) mais aussi pour retourner la vue avec return view()
au lieu de $this->load->view()
.
Routage
Les règles de routage s'écrivent désormais de façon plus morderne grâce à l'apparition des namespaces. Extrait du fichier de routage "application/Config/Routes.php" ci-dessous.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?php $routes = Services::routes(true); $routes->setDefaultNamespace('App\Controllers'); $routes->setDefaultController('Home'); $routes->setDefaultMethod('index'); $routes->setTranslateURIDashes(false); $routes->set404Override(); $routes->setAutoRoute(true); $routes->add('/', 'Home::index'); /* Fonctionne également avec "get" $routes->get('/', 'Home::index'); */ ?> |
Bye bye la syntaxe avec $route['default_controller'] = 'home';
.
Gestionnaire des erreurs
Dans le code du contrôleur, faites-vous violence en ajoutant une erreur dans votre code et vous le droit à une page avec le titre "ErrorException" bien plus complête et plus agréable / jolie que dans la version précédente du framework et ça, c'est franchement une bonne chose pour gagner du temps en développement.
Conclusion
L'équipe de CodeIgniter semble vouloir ramener son framework dans la cour des grands dont il a été éclipsé avec le fork de Laravel mais avec sa force qui est sa courbe d'apprentissage. Il y a une partie "Tutorial" intéressante dans la documention officielle.
Et vous, vous en pensez quoi de cette nouvelle version ?
Sources
- Roadmap phase 1, 2 et 3 : http://forum.codeigniter.com/thread-62615.html
- Roadmap phase 2 détaillée : http://forum.codeigniter.com/thread-65543.html
- Documentation officielle : https://bcit-ci.github.io/CodeIgniter4
- Dépot Github : https://github.com/bcit-ci/CodeIgniter4
- Dépot Github version 3 : https://github.com/bcit-ci/CodeIgniter
- Les namespaces ou "espaces de noms" : http://php.net/manual/fr/language.namespaces.php
- Github container php7.0:apache : https://github.com/docker-library/php/tree/8c97d460ceab62ba76f0344d07f9e5c5d312b295/7.0/apache