Principales différences entre Laravel et Symfony

PRINCIPALES DIFFÉRENCES ENTRE LARAVEL ET SYMFONY

À l'ère du grand nombre de frameworks PHP, les développeurs PHP sont souvent confrontés à la question suivante : quel framework utiliser pour leurs projets ?

Beaucoup sont déjà indécis, ayant trouvé ce qui leur convient le mieux, et pour certains il est difficile de déterminer la réponse.

Voyons et comparons certaines caractéristiques de frameworks aussi populaires que Symfony et Laravel.

Installation du Frameworks


Les fichiers de base des frameworks PHP modernes peuvent être installés à l'aide du gestionnaire de paquets Composer.

Ainsi, pour Laravel, cela peut être fait avec la commande composer create-project --prefer-dist laravel/laravel nom_du_projet pour Symfony composer create-project symfony/website-skeleton nom_du_projet, où nom_du_projet est le nom du projet et en même temps le nom du répertoire créé où composer placera les fichiers du framework.

En même temps, les deux systèmes ont maintenant leur propre installateur, laravel nouveau nom de projet et symfony nouveau nom de projet, et les installateurs eux-mêmes peuvent être installés en exécutant une seule ligne : composer global require laravel/installer et wget https://get.symfony.com/cli/installer -O - | bash respectivement.

Vous pouvez ainsi constater que le processus d'installation de la fonctionnalité minimale est réduit au minimum et prend très peu de temps.

Mise en place


Les deux frameworks prennent désormais en charge un fichier de configuration .env qui stocke des paires clé-valeur, mais Symfony prend également en charge les fichiers yaml pour la configuration du routage, des services et autres.

Le format yaml est très utile et vous permet de spécifier les valeurs de configuration d'une manière qui ressemble à un tableau multidimensionnel.

Routage


Chaque framework a sa propre façon de spécifier les routes d'application et de les lier aux contrôleurs. Ainsi, pour spécifier dans Laravel que la route "/test" doit être traitée par la méthode TestController, vous devez spécifier ce qui suit dans le fichier de routage routes/api.php : Route::get('/test', '[email protected]')->name('test_name') ; Pour Symfony, on peut faire de même avec les fichiers yaml responsables du routage ou, plus commodément, avec les annotations .

namespace App\Controller;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class TestController {

    /**
     * @Route("/test", name="test_name")
     */
    public function test() {
         return new Response('Some test text');
    }
}

 

 

 

L'utilisation de contrôleurs présente un grand nombre d'avantages. Ainsi, dans le chemin d'accès "/test", vous pouvez spécifier des paramètres dynamiques, par exemple "/test/{id}". Maintenant vous devez spécifier le paramètre $id dans la signature du contrôleur, et sa valeur sera tirée du chemin. Vous pouvez également formater les paramètres dynamiques à l'aide d'expressions régulières. Ainsi, par exemple, $id est uniquement un nombre entier. En outre, chaque cadre dispose d'une fonctionnalité permettant de combiner les routes en groupes et de leur attribuer des préfixes, d'attribuer des méthodes HTTP par lesquelles ces routes seront disponibles et de fournir un support pratique pour les paramètres GET et POST.

Migrations et ORM


Les deux systèmes offrent un ensemble utile de commandes de console pour les migrations de projets, mais la principale différence entre Laravel et Symfony réside peut-être dans leur mode de fonctionnement. Dans Laravel, nous devons créer des migrations par nous-mêmes, et nous devons aussi garder la structure de notre base de données et les classes PHP synchronisées.
Ainsi, par exemple, le code de migration ressemblerait à ceci

Schema::create('tests', function (Blueprint $table) {
$table->bigIncrements('id') ;
}) ;


et la classe Test ressemblera à ceci

namespace App;

use Illuminate\Database\Eloquent\Model;

class Test extends Model
{
    protected $table = 'tests';
}


Comme vous pouvez le constater, tous les modèles de Laravel héritent de la classe Model.
Dans Symfony, en revanche, vous travaillez avec les migrations par le biais de l'ORM Doctrine. Ici, nous ne pouvons travailler qu'avec des classes et des annotations PHP.
Ainsi, un exemple de code pour la classe Test ressemblerait à ceci

 

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity()
 */
class Test
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;
}

 


Après avoir créé l'entité Test, nous pouvons commencer à créer une migration où Symfony crée lui-même le code SQL exécutable pour créer la table des tests avec la colonne id. De plus, nous n'avons pas besoin de maintenir la structure de la base de données et les classes PHP aussi soigneusement que possible, car lors de la création des migrations, le framework compare la structure actuelle de la base de données avec celle attendue sur la base des classes PHP actuelles et génère tout le SQL nécessaire.

Il est intéressant de noter que les deux frameworks fournissent des ORM pour l'analyse des bases de données. Dans Laravel, c'est Eloquent qui s'en charge. Ainsi, par exemple, le code ci-dessous permet d'obtenir une collection d'objets de la classe Test :

$tests = App\Test::where('id', '<', 100)
   ->orderBy('id', 'desc')
               ->take(10)
               ->get();


Dans Symfony, ce type de code fréquemment utilisé est déplacé vers des classes spéciales de dépôt, tandis que le corps de la méthode elle-même ressemble à ceci

$tests = $this->createQueryBuilder('t')
            ->where('t.id < :id')
            ->setParameter('id', 100)
            ->orderBy('t.id', 'DESC')
            ->setMaxResults(10)
            ->getQuery()
            ->execute();


Dans ce cas, il retournera un tableau d'objets de la classe Test, et l'ORM de Doctrine s'en chargera.
Eloquent et Doctrine mettent tous deux en œuvre le modèle de conception Fluent Interface, comme vous pouvez le voir d'après les noms des méthodes where, orderBy et autres. 

Si vous êtes familier avec l'un des moteurs de création de modèles, vous comprendrez l'autre sans trop de difficultés. En ce qui concerne le front-end, Laravel prend également en charge Vue.js, ce qui ouvre des possibilités supplémentaires, mais dans le web d'aujourd'hui, il n'est pas impossible d'utiliser n'importe quel framework back-end PHP en combinaison avec un framework front-end JavaScript tel que React, Angular ou Vue.js. En conclusion, parmi les deux grands frameworks, Laravel et Symfony, vous ne pouvez pas choisir le meilleur, mais seulement celui qui répond le mieux à vos besoins spécifiques. Bien qu'elles mettent en œuvre des stratégies différentes pour créer l'application web résultante, aucune des deux implémentations ne peut être qualifiée de mauvaise. Les deux frameworks vous permettent d'étendre considérablement les fonctionnalités de base en fonction de vos besoins, et le grand nombre de paquets installés avec composer ne fait qu'y contribuer. Laravel et Symfony peuvent tous deux être utilisés aussi bien pour les petits sites que pour les sites d'entreprise, notamment en raison des systèmes de mise en cache intégrés et des hautes performances. Chacun d'entre eux est potentiellement extensible, de sorte qu'une fois que vous avez choisi un cadre pour un nouveau projet, c'est à vous de décider de son extensibilité.