Comment configurer une application CakePHP avec LAMP sous Ubuntu 18.04

L'auteur a sélectionné lesFree and Open Source Fund pour recevoir un don dans le cadre du programmeWrite for DOnations.

introduction

CakePHP est un framework Web PHP populaire et riche en fonctionnalités. Il résout bon nombre des problèmes courants du développement Web, tels que l’interaction avec une base de données, la protection contre les injections SQL et la génération de code de vue. Il adhère au modèlemodel-view-controller (MVC), qui découple différentes parties de l'application, permettant ainsi aux développeurs de travailler sur différentes parties de l'application en parallèle. Il fournit également une sécurité et une authentification intégrées. Créer une application de base de données de base est un processus transparent, ce qui rend CakePHP utile pour le prototypage. Cependant, vous pouvez utiliser CakePHP pour créer des applications Web entièrement développées pour le déploiement.

Dans ce tutoriel, vous allez déployer un exemple d'application Web CakePHP dans un environnement de production. Pour ce faire, vous allez configurer un exemple de base de données et d'utilisateur, configurer Apache, connecter votre application à la base de données et désactiver le mode de débogage. Vous utiliserez également la commandebake de CakePHP pour générer automatiquement des modèles d'article.

Conditions préalables

Avant de commencer ce tutoriel, vous aurez besoin de:

  • Un serveur exécutant Ubuntu 18.04 avec un accès root et un compte sudo, non root, vous pouvez le configurer en suivantthis initial server setup guide.

  • Une pile LAMP installée selonHow To Install Linux, Apache, MySQL, PHP (LAMP) stack on Ubuntu 18.04. Au moment de la rédaction de ce document, PHP 7.2 est la dernière version.

  • Composer (un gestionnaire de paquets PHP) installé sur votre serveur. Pour obtenir un guide sur la façon de procéder, visitezHow To Install and Use Composer on Ubuntu 18.04. Il vous suffit de suivre les deux premières étapes de ce didacticiel.

  • Apache sécurisé avec Let’s Encrypt. Pour remplir ce prérequis, vous devrez d'abord configurer des hôtes virtuels en suivant l'étape 5 deHow To Install Apache on Ubuntu 18.04. Vous pouvez ensuite suivreHow To Secure Apache with Let’s Encrypt on Ubuntu 18.04 pour sécuriser Apache avec Let’s Encrypt. Lorsque vous y êtes invité, activez la redirection HTTPS obligatoire.

  • Un nom de domaine entièrement enregistré. Ce didacticiel utiliseraexample.com partout. Vous pouvez acheter un nom de domaine surNamecheap, en obtenir un gratuitement surFreenom ou utiliser le registraire de domaine de votre choix.

  • Les deux enregistrements DNS suivants sont configurés pour votre serveur. Vous pouvez suivrethis introduction vers DigitalOcean DNS pour savoir comment les ajouter.

    • Un enregistrement A avecexample.com pointant vers l'adresse IP publique de votre serveur.

    • Un enregistrement A avecwww.example.com pointant vers l'adresse IP publique de votre serveur.

[[step-1 -—- Installing-dependencies]] == Étape 1 - Installation des dépendances

Pour préparer votre application, commencez par installer les extensions PHP nécessaires à CakePHP.

Commencez par mettre à jour le cache du gestionnaire de paquets:

sudo apt update

CakePHP nécessite les extensions PHPmbstring,intl etsimplexml, qui ajoutent la prise en charge des chaînes multi-octets, l'internationalisation et le traitement XML. Vous avez installémbstring dans le cadre du didacticiel sur les prérequis de Composer. Vous pouvez installer les bibliothèques restantes avec une seule commande:

sudo apt install php7.2-intl php7.2-xml -y

N'oubliez pas que les numéros de version ci-dessus (7.2) changeront avec les nouvelles versions de PHP.

Vous avez installé les dépendances requises pour CakePHP. Vous êtes maintenant prêt à configurer votre base de données MySQL pour une utilisation en production.

[[step-2 -—- setting-up-a-mysql-database]] == Étape 2 - Configuration d'une base de données MySQL

Vous allez maintenant créer une base de données MySQL pour stocker des informations sur les articles de votre blog. Vous allez également créer un utilisateur de base de données que votre application utilisera pour accéder à la base de données. Vous allez modifier les privilèges de la base de données pour obtenir cette séparation de contrôle. En conséquence, les mauvais acteurs ne pourront pas causer de problèmes sur le système, même avec les informations d'identification de la base de données, ce qui constitue une précaution de sécurité importante dans un environnement de production.

Lancez votre shell MySQL:

sudo mysql -u root -p

Lorsque vous y êtes invité, entrez le mot de passe que vous avez défini lors de l'installation initiale de LAMP.

Ensuite, créez une base de données:

CREATE DATABASE cakephp_blog;

Vous verrez une sortie similaire à:

OutputQuery OK, 1 row affected (0.00 sec)

Votre application CakePHP utilisera cette nouvelle base de données pour lire et stocker les données de production.

Ensuite, demandez à MySQL d'opérer sur la nouvelle base de donnéescakephp_blog:

USE cakephp_blog;

Vous verrez une sortie similaire à:

OutputDatabase changed

Vous allez maintenant créer un schéma de table pour vos articles de blog dans la base de donnéescakephp_blog. Exécutez la commande suivante pour configurer ceci:

CREATE TABLE articles (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(50),
    body TEXT,
    created DATETIME DEFAULT NULL,
    modified DATETIME DEFAULT NULL
);

Vous avez créé un schéma avec cinq champs pour décrire les articles de blog:

  • id: est l'identifiant unique d'un article, configuré comme clé primaire.

  • title: est le titre d'un article, déclaré comme un champ de texte contenant un maximum de 50 caractères.

  • body: est le texte de l'article, déclaré comme champTEXT.

  • created: est la date et l’heure de création d’un enregistrement.

  • modified: est la date et l'heure de la modification d'un enregistrement.

La sortie sera similaire à:

OutputQuery OK, 0 rows affected (0.01 sec)

Vous avez créé une table pour stocker les articles dans la base de donnéescakephp_blog. Ensuite, remplissez-le avec des exemples d'articles en exécutant la commande suivante:

INSERT INTO articles (title, body, created)
    VALUES ('Sample title', 'This is the article body.', NOW());

Vous avez ajouté un exemple d'article avec des exemples de données pour le titre et le corps du texte.

Vous verrez la sortie suivante:

OutputQuery OK, 0 rows affected (0.01 sec)

Afin de connecter l'application CakePHP à la base de données, vous devez créer un nouvel utilisateur de base de données et restreindre ses privilèges:

GRANT ALL PRIVILEGES ON cakephp_blog.* TO 'cake_user'@'localhost' IDENTIFIED BY 'password';

Cette commande accorde tous les privilèges à toutes les tables de la base de données.

N'oubliez pas de remplacerpassword par un mot de passe fort de votre choix.

Pour mettre à jour votre base de données avec les modifications que vous avez apportées, rechargez-la en exécutant:

FLUSH PRIVILEGES;

Vous venez de créer un nouvel utilisateur de base de données,cake_user, et vous ne lui avez donné les privilèges utilisateur que sur la base de donnéescakephp_blog, renforçant ainsi la sécurité.

Quittez le terminal MySQL en entrantexit.

Vous avez créé une nouvelle base de données avec un schéma, vous l'avez renseigné avec des exemples de données et créé un utilisateur de base de données approprié. Dans l'étape suivante, vous allez configurer l'application CakePHP elle-même.

[[step-3 -—- creation-the-blog-application]] == Étape 3 - Création de l'application de blog

Dans cette section, vous utiliserez Composer pour installer un exemple d’application CakePHP. Il est avantageux d’utiliser Composer car il vous permet d’installer CakePHP à partir de votre ligne de commande et de configurer automatiquement certaines autorisations de fichiers et certains fichiers de configuration.

Tout d’abord, accédez au dossier du serveur Web Apache:

cd /var/www/example.com/html

Apache utilise ce répertoire pour stocker des fichiers visibles au monde extérieur. L'utilisateurroot possède ce répertoire, et donc votre utilisateur non root,sammy, ne peut rien y écrire. Pour corriger cela, vous allez modifier les autorisations du système de fichiers en exécutant:

sudo chown -R sammy .

Vous allez maintenant créer une nouvelle application CakePHP via Composer:

composer create-project --prefer-dist cakephp/app cake-blog

Ici, vous avez appelécomposer et lui avez demandé de créer un nouveau projet aveccreate-project. --prefer-dist cakephp/app dit àcomposer d'utiliser CakePHP comme modèle aveccake-blog comme nom de la nouvelle application.

Gardez à l'esprit que cette commande peut prendre un certain temps pour terminer.

Lorsque Composer vous demande de configurer les autorisations de dossier, répondez avecy.

Dans cette section, vous avez créé un nouveau projet CakePHP avec Composer. Dans l'étape suivante, vous allez configurer Apache pour qu'il pointe vers la nouvelle application, ce qui la rend visible dans votre navigateur.

[[step-4 -—- configuring-apache-to-point-to-your-app]] == Étape 4 - Configuration d'Apache pour pointer vers votre application

Maintenant, vous allez configurer Apache pour votre nouvelle application CakePHP, ainsi que permettre le remplacement de.htaccess, qui est une exigence de CakePHP. Cela implique la modification des fichiers de configuration Apache.

Pour que le routage ait lieu, vous devez demander à Apache d'utiliser les fichiers.htaccess. Ce sont des fichiers de configuration qui figureront dans les sous-répertoires de l'application (le cas échéant), puis Apache les utilisera pour modifier sa configuration globale pour la partie demandée de l'application. Entre autres tâches, elles contiendront des règles de réécriture d’URL, que vous allez ajuster maintenant.

Commencez par ouvrir le fichier de configuration globale Apache (apache2.conf) à l'aide de votre éditeur de texte:

sudo nano /etc/apache2/apache2.conf

Recherchez le bloc de code suivant:

/etc/apache2/apache2.conf

...

        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted

...

ChangezAllowOverride deNone enAll, comme suit:

/etc/apache2/apache2.conf

...

        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted

...

Enregistrez et fermez le fichier.

Ensuite, vous demanderez à Apache de pointer vers le répertoirewebroot dans l'installation de CakePHP. Apache stocke ses fichiers de configuration sur Ubuntu 18.04 dans/etc/apache2/sites-available. Ces fichiers régissent la manière dont Apache traite les requêtes Web.

Au cours du didacticiel de Let Encrypt, vous avez activé la redirection HTTPS. n'autorisant donc que le trafic HTTPS. Par conséquent, vous ne modifierez que le fichierexample.com-le-ssl.conf, qui configure le trafic HTTPS.

Tout d'abord, ouvrez le fichier de configuration deexample.com-le-ssl.conf:

sudo nano /etc/apache2/sites-available/example.com-le-ssl.conf

Vous n'avez besoin de changer qu'une seule ligne, celle qui configureDocumentRoot et indique à Apache d'où servir le contenu au navigateur. Recherchez la ligne suivante dans le fichier:

/etc/apache2/sites-available/example.com-le-ssl.conf

DocumentRoot /var/www/example.com/html

Modifiez cette ligne pour qu'elle pointe vers l'installation de CakePHP, en ajoutant le contenu mis en surbrillance suivant:

/etc/apache2/sites-available/example.com-le-ssl.conf

DocumentRoot /var/www/example.com/html/cake-blog/webroot

Enregistrez le fichier et quittez l'éditeur.

Ensuite, redémarrez Apache pour refléter la nouvelle configuration:

sudo systemctl restart apache2

Vous pouvez maintenant visiterhttps://your_domain/ dans votre navigateur.

CakePHP can’t connect to the database

Vous verrez la page de succès de CakePHP par défaut. Vous remarquerez qu’un blocage indique que votre application ne peut pas se connecter à la base de données. Dans la prochaine étape, vous allez résoudre ce problème en connectant votre application à la base de données.

Vous avez maintenant activé le remplacement de.htaccess et dirigé Apache vers le bon répertoirewebroot.

[[step-5 -—- connection-your-app-to-the-database]] == Étape 5 - Connexion de votre application à la base de données

Dans cette section, vous allez connecter votre base de données à votre application pour que votre blog puisse accéder aux articles. Vous allez éditer le fichierconfig/app.php par défaut de CakePHP pour configurer la connexion à votre base de données.

Accédez au dossier de l'application:

cd /var/www/example.com/html/cake-blog

Ouvrez le fichierconfig/app.php, en exécutant la commande suivante:

sudo nano config/app.php

Trouvez le blocDatasources (il ressemble à ce qui suit):

/var/www/example.com/html/cake-blog/config/app.php

...
    'Datasources' => [
        'default' => [
            'className' => 'Cake\Database\Connection',
            'driver' => 'Cake\Database\Driver\Mysql',
            'persistent' => false,
            'host' => 'localhost',
            ...
            //'port' => 'non_standard_port_number',
            'username' => 'cake_user',
            'password' => 'password',
            'database' => 'cakephp_blog',
...

Pour'username', remplacezmy_app par le nom d'utilisateur de votre base de données (ce didacticiel utilise:cake_user),secret avec le mot de passe de votre utilisateur de base de données et le secondmy_app avec le nom de la base de données (cakephp_blog dans ce didacticiel).

Enregistrez et fermez le fichier.

Actualisez l'application dans votre navigateur et observez le message de réussite dans la sectionDatabase. Si cela indique une erreur, revérifiez votre fichier de configuration par rapport aux étapes précédentes.

CakePHP can connect to the database

Dans cette étape, vous avez connecté l’application CakePHP à votre base de données MySQL. Dans l'étape suivante, vous allez générer les fichiers de modèle, de vue et de contrôleur qui constitueront l'interface utilisateur permettant d'interagir avec les articles.

[[step-6 -—- creation-the-article-user-interface]] == Étape 6 - Création de l'interface utilisateur de l'article

Dans cette section, vous allez créer une interface d'article prête à l'emploi en exécutant la commande CakePHPbake, qui génère le modèle d'article. Dans CakePHP, la cuisson génère tous les modèles, vues et contrôleurs requis dans un état basique, prêts pour un développement ultérieur. Chaque application de base de données doit permettre les opérations de création, lecture, mise à jour et suppression (CRUD), ce qui rend la fonctionnalitébake de CakePHP utile pour générer automatiquement du code pour ces opérations. En quelques minutes, vous obtenez un prototype complet de l'application, prêt à entrer, stocker et modifier les données.

Les modèles, vues et contrôleurs appartiennent au modèleMVC. Leurs rôles sont:

  • Les modèles représentent la structure de données.

  • Les vues présentent les données de manière conviviale.

  • Les contrôleurs agissent à la demande des utilisateurs et servent d’intermédiaire entre les vues et les modèles.

CakePHP stocke son exécutable CLI sousbin/cake. Bien qu’il soit principalement utilisé pour la cuisson, il offre une multitude d’autres commandes, telles que celles permettant de vider divers caches.

La commandebake vérifiera votre base de données et générera les modèles en fonction des définitions de table trouvées. Commencez par lancer la commande suivante:

./bin/cake bake all

En passant la commandeall, vous indiquez à CakePHP de générer des modèles, des contrôleurs et des vues en même temps.

Votre sortie ressemblera à ceci:

OutputBake All
---------------------------------------------------------------
Possible model names based on your database:
- articles
Run `cake bake all [name]` to generate skeleton files.

Il a correctement détecté la définition dearticles de votre base de données et propose de générer des fichiers pour ce modèle.

Cuire au four en lançant:

./bin/cake bake all articles

Votre sortie ressemblera à ceci:

OutputBake All
---------------------------------------------------------------
One moment while associations are detected.

Baking table class for Articles...

Creating file /var/www/example.com/html/cake-blog/src/Model/Table/ArticlesTable.php
Wrote `/var/www/example.com/html/cake-blog/src/Model/Table/ArticlesTable.php`
Deleted `/var/www/example.com/html/cake-blog/src/Model/Table/empty`

Baking entity class for Article...

Creating file /var/www/example.com/html/cake-blog/src/Model/Entity/Article.php
Wrote `/var/www/example.com/html/cake-blog/src/Model/Entity/Article.php`
Deleted `/var/www/example.com/html/cake-blog/src/Model/Entity/empty`

Baking test fixture for Articles...

Creating file /var/www/example.com/html/cake-blog/tests/Fixture/ArticlesFixture.php
Wrote `/var/www/example.com/html/cake-blog/tests/Fixture/ArticlesFixture.php`
Deleted `/var/www/example.com/html/cake-blog/tests/Fixture/empty`
Bake is detecting possible fixtures...

Baking test case for App\Model\Table\ArticlesTable ...

Creating file /var/www/example.com/html/cake-blog/tests/TestCase/Model/Table/ArticlesTableTest.php
Wrote `/var/www/example.com/html/cake-blog/tests/TestCase/Model/Table/ArticlesTableTest.php`

Baking controller class for Articles...

Creating file /var/www/example.com/html/cake-blog/src/Controller/ArticlesController.php
Wrote `/var/www/example.com/html/cake-blog/src/Controller/ArticlesController.php`
Bake is detecting possible fixtures...

...

Baking `add` view template file...

Creating file /var/www/example.com/html/cake-blog/src/Template/Articles/add.ctp
Wrote `/var/www/example.com/html/cake-blog/src/Template/Articles/add.ctp`

Baking `edit` view template file...

Creating file /var/www/example.com/html/cake-blog/src/Template/Articles/edit.ctp
Wrote `/var/www/example.com/html/cake-blog/src/Template/Articles/edit.ctp`
Bake All complete.

Dans la sortie, vous verrez que CakePHP a enregistré toutes les étapes nécessaires pour créer un passe-partout fonctionnel pour la base de donnéesarticles.

Maintenant, naviguez vers les éléments suivants dans votre navigateur:

https://your_domain/articles

Vous verrez une liste des articles actuellement dans la base de données, qui comprend une ligne intituléeSample Title. La commandebake a créé cette interface vous permettant de créer, supprimer et modifier des articles. En tant que tel, il fournit un solide point de départ pour un développement ultérieur. Vous pouvez essayer d'ajouter un nouvel article en cliquant sur le lienNew Article dans la barre latérale.

The generated article user interface

Dans cette section, vous avez généré des fichiers de modèle, de vue et de contrôleur avec la commandebake de CakePHP. Vous pouvez maintenant créer, supprimer, afficher et modifier vos articles avec toutes vos modifications immédiatement enregistrées dans la base de données.

Dans l'étape suivante, vous allez désactiver le mode débogage.

[[step-7 -—- disabling-debug-mode-in-cakephp]] == Étape 7 - Désactivation du mode de débogage dans CakePHP

Dans cette section, vous allez désactiver le mode débogage dans CakePHP. Cela est crucial car en mode débogage, l'application affiche des informations détaillées sur le débogage, ce qui constitue un risque pour la sécurité. Vous terminerez cette étape une fois le développement de votre application terminé.

Ouvrez le fichierconfig/app.php en utilisant votre éditeur préféré:

sudo nano config/app.php

Près du début du fichier, il y aura une ligne pour le mode'debug'. Lorsque vous ouvrez le fichier, le mode'debug' sera réglé surtrue. Remplacez-le parfalse comme suit:

config/app.php

...
'debug' => filter_var(env('DEBUG', false), FILTER_VALIDATE_BOOLEAN),
...

Une fois que vous avez désactivé le mode de débogage, la page d'accueil, située soussrc/Templates/Pages/home.ctp, affichera une erreur.

The debug mode error

[.note] #Note: Si vous n'avez pas modifié l'itinéraire par défaut ou remplacé le contenu dehome.ctp, la page d'accueil de votre application affichera désormais une erreur. En effet, la page d'accueil par défaut sert de tableau de bord d'état pendant le développement, mais ne fonctionne pas avec le mode débogage désactivé.
#

Vous avez désactivé le mode débogage. Les erreurs et les exceptions qui se produisent à partir de maintenant, ainsi que leurs traces de pile, ne seront pas montrées à l'utilisateur final, ce qui renforcera la sécurité de votre application.

Cependant, après avoir désactivé le mode débogage, votrehome.ctp affichera une erreur. Si vous avez terminé cette étape uniquement aux fins de ce didacticiel, vous pouvez désormais rediriger votre page d'accueil vers l'interface de liste d'articles en conservant le mode débogage désactivé. Vous y parviendrez en modifiant le contenu dehome.ctp.

Ouvrezhome.ctp pour l'édition:

sudo nano src/Template/Pages/home.ctp

Remplacez son contenu par ce qui suit:

src/Template/Pages/home.ctp

Ce HTML redirige vers le contrôleurArticles. Si la redirection automatique échoue, les utilisateurs doivent également suivre un lien.

Dans cette étape, vous avez désactivé le mode de débogage pour des raisons de sécurité et corrigé l'erreur de la page d'accueil en redirigeant l'utilisateur vers l'interface de liste d'articles de blog fournie par le contrôleurArticles.

Conclusion

Vous avez maintenant configuré avec succès une application CakePHP sur une pile LAMP sous Ubuntu 18.04. Avec CakePHP, vous pouvez créer une base de données avec autant de tables que vous le souhaitez, et cela produira un éditeur Web en direct pour les données.

LeCakePHP cookbook offre une documentation détaillée sur tous les aspects de CakePHP. La prochaine étape pour votre application pourrait inclure la mise en œuvre de l’authentification de l’utilisateur afin que chaque utilisateur puisse créer ses propres articles.