Laravel versus Symfony

Installation (sous Windows)

Laravel

Prérequis: il faut avoir installé PHP7, un serveur PHP (apache par exemple), mySQL et un serveur de bases de données. Il ya des solutions pour installer tout ça d'un coup telles que WampServer et Laragon, ce dernier a ma préférence. La documentation officielle préconise d'installer Docker et Laravel Sail, mais j'ai pas encore essayé. Il faut également installer composer, Node.js et c'est fortement recommandé d'avoir git.

Pour créér in nouveau projet, avec Laragon il suffit de selectionner menu>créer un site web rapidemment>Laravel, sinon on doit taper dans un terminal de commande: composer create-project laravel/laravel nom-du-projet --prefer-dist, copier .env.example dans un fichier .env, taper php artisan key:generate. Ensuite on installe les modules Node avec npm install.

Depuis le répertoire du projet, on tape "git init" pour gérer les versions du projet et le copier sur un dépot distant.

Pour cloner un projet existant, il faut se placer dans le dossier où l'on compte installer le projet, taper "git init", puis git clone https://adresse-du-truc-a-cloner.git, taper composer update, copier .env.example dans un .env, dans ce fichier indiquer le nom de la base de données qu'on va utiliser pour ce projet (vous en créez une vide du même nom), taper php artisan key:generate puis npm install.

Symfony

Prérequis: il faut avoir installé PHP7, un serveur PHP (apache par exemple), mySQL et un serveur de bases de données. Il ya des solutions pour installer tout ça d'un coup telles que WampServer et Laragon, ce dernier a ma préférence, Il faut également installer composer, Node.js et c'est fortement recommandé d'avoir git.

Pour créér in nouveau projet, avec Laragon il suffit de selectionner menu>créer un site web rapidemment>Symfony, qui va charger le squelette d'une application Symfony. Dans le repertoire créé, on initialise un dépot git avec "git init".

Pour le serveur: avec laragon on n'utilise pas le serveur de base du pack symfony (d'ailleurs on ne l'a pas et on ne peut plus le télécharger), mais le serveur apache, donc on doit taper "composer require symfony/apache-pack " dans le terminal de commande.

Laragon m'a aussi créé une base de données MySQL de même nom que le projet et me la configurée dans le fichier .env, faut juste penser à décommenter la ligne (enlever le #).

C'est pas fini, pour travailler je vais aussi avoir besoin de quelques composants supplémentaires:
composer require annotations (pour mettre les routes en annotations devant les fonctions)
composer require symfony/maker-bundle --dev (pour faire les entités, contrôleurs, cruds...)
composer require symfony/orm-pack (pour la base de données)

La structure

Laravel

Le dossier app contient la majeure partie du code de l'application (classes, contrôleurs, middlewares...), le dossier bootstrap ce qu'il faut pour lancer l'application, le dossier config comme son nom l'indique les fichiers de configuration, le dossier database contient les migrations (les classes qui génèrent les tables), les ensemencements (seeds) qui génèrent du contenu pour ces tables, à des fins de tests notamment, les dossiers node-modules et vendor les dépendances respectives node.js et PHP, le dossier public contient les ressources utilisables directement par les vues (images statiques mais pas celles téléchargées par les utilisateurs, le css et javascript finaux), le dossier resources contient le sass ou le scss, les fichiers javascripts non compilés et les vues (views), le dossier routes ben euh, les routes, nous y reviendrons, storage contient les fichiers générés par le framework ou l'application le cas échéants (templates compilés, logs...), le dossier tests contient les tests automatisés (tests unitaires).

Cliquez sur l'image ci-dessous pour voir l'arborescsnce.

Symfony

Le code se trouve dans le dossier src (classes de données: dossier Entity, contrôleurs: controller, Form contient les classes qui génèrent les formulaires, Repository les classes qui gèrent les appels à la base de données pour les entités, Services contient les classes servant d'outils pour l'application et DataFixtures est en quelque sorte un équivalent des seeds Laravel). Le dossier assets contient le css et le js non compilés, les compilés se trouvant dans le dossier public, migrations contient les classes de création de tables, les vues et leurs éléments se trouvent dans templates (un dossier par entité), config, node-modules, vendor et tests jouent le m^me rôle qu'avec laravel, tools contient des outils extérieurs (exemple: php-cs-fixer, var contient le dossier de cache et les logs, translations les langages.

Cliquez sur l'image ci-dessous pour voir l'arborescsnce.

Configuration

Laravel

Les variables d'environnement se trouvent dans le fichier .env à la racine du projet. Lors de l'installation, on copie .env.example dans .env et on modifie les valeurs qui le nécessitent. On ne doit pas transmettre .env sur son dépôt distant, pour des raisons de sécurité et parce que les variables d'environnement ne sont pas les mêmes pour tous les utilisateurs.

Il y a assez peu de choses à configurer pour une petite application, le nom et le moteur de la base de données principalement, pour le reste on peut garder la configuration par défaut.

documentation officielle

Symfony

Dans le dossier config, on trouve le dossier routes qui contient le fichier de configuration routes.yaml, mais il est recommandé d'utiliser plutôt les annotations pour définir les routes, et aussi service.yaml où l'on définit les services et les variables accessibles depuis les contrôleurs ou depuis d'autres services. Il y a également un dossier packages où l'on configure ce qui est propre à chaque package, c'est à dire "dev", "prod" et "test". On peut garder la configuration par défaut le plus souvent.

documentation officielle

Le routage

Laravel

Les routes sont définies dans le dossier routes, Au format PHP. Par défaut on définit les routes des pages web dans web.php.

Une route a toujours au minimum une URI et une closure, quelque chose pouvant être appelé: une fonction du contrôleur, une fonction définie dans la route elle-même, ou bien une vue. Il est fortement conseillé d'y ajouter un nom! Exemples:
route::get('/greeting', function () {return 'Hello World';});
Route::get('/home', 'HomeController@index')->name('home');
Route::post('/animal.update/{animal}', 'AnimalController@update')->name('animal.update');
Route::view('/welcome', 'welcome', ['name' => 'Taylor']);

Les routes peuvent utiliser les méthodes get, post, put, past, delete, options (pour celles qui modifient la base de données, la vue devra comprendre un jeton CRSF pour éviter que la requête ne soit rejetée). La méthode 'any' est utilisée pour une route qui accepte toute les requêtes, et match pour une qui en accepte plusieurs:
route::match(['get', 'post'], '/', function () {//});

La redirection se fait avec la méthode redirect, ou permanentRedirect:
Route::redirect('/ici', '/la');

documentation officielle

Symfony

Les routes peuvent être définies dans un ficier yaml ou xml dédié, mais il est recommandé de les définir dans les annotations, c'est à dire au-dessus de chaque fonction.

Exemple: /**
* @Route("/{id}", name="article_delete", methods={"DELETE"})
*/
public function delete(Request $request, Generator $generator, Article $article): Response
{//}

Le cycle d'une requête

Laravel

Toute requête traitée par le serveur (Apache ou Nginx) est dirigée sur le fichier index.php du dosssier public. Le code de ce fichier charge autoload de composer, qui charge les classes Laravel, fournit une instance de l'application Laravel à partir de bootstrap/app.php. Laravel crée ensuite une instance du conteneur de services (service container). La requête est alors envoyée selon la nature soit au noyau HTTP (app/Http/kernel.php), soit à celui de la console.

HTTP kernel détecte l'environnement de l'application et s'occupe de la configuration, des middlewares, du mode de session (production, maintenance), de vérifier le CSRF token, Letc... Bref il s'occupe de tout et retourne ensuite une réponse.

documentation officielle

Symfony

La requête HTTP est gérée par le noyau (le composant httpKernel), qui envoie des évènements lorsque la requête est reçue sur le serveur et de la désérialisation de son contenu (kernel.request), lors de sa validation, l'écriture en bases de données et la sérialisation (kernel.view), puis lors de l'envoi de la réponse (kernel.response).Un écouteur de ce dernier évènement déterminera le contrôleur à utiliser si nécessaire grâce au routage.

documentation officielle

Création d'un modèle

Laravel

Les "Eloquent Models" se crééent par la commande php artisan make:model NomChoisi, on peut créer le modèle et la migration simultanément par la commande php artisan make:model NomChoisi --migration. Le fichier classe est généré dans le dossier app\Models et le fichier de migration dans le dossier database\migrations. Contrairement à Symfony, il faut remplir manuellement les champs dans le fichier migration, et les attributs correspondant à des clés étrangères dans le modèle. On éxecute ensuite les migrations avec php artisan migrate.

documentation officielle

Symfony

Les modèles sont appelés "Entity", on les crée par la commande php bin/console make:entity, un questionnaire apparait pour renseigner les différents champs ou attributs (nom, type, type de relation pour les clés étrangères), une fois celui-ci terminé symfony génère le fichier classe correspondant dans le dossier "Entity", avec les attributs privés, des accesseurs et mutateurs publiques, et un fichier nomdumodeleRepository dans le dossier Repository qui traitera les requêtes vers la table correspondante de la base de données (quand elle sera crée).

On crée la table correspondant au modèle au moyen de la commande: php bin/console make:migration, qui va générer un fichier contenant le code SQL pour créer la table, puis en éxécutant la ou les migrations avec la commande php bin/console doctrine:migrations:migrate.

documentation officielle

Textes et dessins de Christine Zedday
Photos Christine Zedday, Alain et Hélène Bache, Boujemaa, Leïla et Nora Zedday

Cette page a été générée automatiquement par Imageur

CSS Valide !