Laravel Vs Symfony – concetti chiave e terminologia

Symfony e Laravel sono due framework PHP molto popolari, ciascuno con un approccio e una terminologia unica. In questo articolo, confronto i principali concetti di Laravel con quelli equivalenti in Symfony, offrendo esempi di codice per ciascun caso.
Middleware (Laravel) vs Event Subscriber (Symfony)
Laravel: Middleware
I middleware in Laravel sono classi che filtrano le richieste HTTP. Possono essere utilizzati per compiti come l’autenticazione o la registrazione dei log.
[sh_prismjs_pre class=”language-php” ]
<?php namespace App\Http\Middleware; use Closure; class CheckAge { public function handle($request, Closure $next) { if ($request->age < 18) { return redirect('home'); } return $next($request); } }
[/sh_prismjs_pre]
Symfony: Event Subscriber
In Symfony, il concetto simile si realizza con gli Event Subscriber o i Kernel Events, che permettono di manipolare le richieste e risposte.
[sh_prismjs_pre class=”language-php” ]
<?php namespace App\EventSubscriber; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpKernel\Event\RequestEvent; class CheckAgeSubscriber implements EventSubscriberInterface { public static function getSubscribedEvents() { return [ RequestEvent::class => 'onKernelRequest', ]; } public function onKernelRequest(RequestEvent $event) { $request = $event->getRequest(); if ($request->get('age') < 18) { $event->setResponse(new RedirectResponse('/home')); } } }
[/sh_prismjs_pre]
Eloquent ORM (Laravel) vs Doctrine ORM (Symfony)
Laravel: Eloquent ORM
Laravel utilizza Eloquent come ORM per interagire con il database tramite Active Record.
[sh_prismjs_pre class=”language-php” ]
namespace App\Models; use Illuminate\Database\Eloquent\Model; class User extends Model { protected $fillable = ['name', 'email', 'password']; } // Query example $users = User::where('active', true)->get();
[/sh_prismjs_pre]
Symfony: Doctrine ORM
Symfony utilizza Doctrine come ORM, basato sul pattern Data Mapper.
[sh_prismjs_pre class=”language-php” ]
<?php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; #[ORM\Entity] class User { #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column(type: 'integer')] private $id; #[ORM\Column(type: 'string')] private $name; #[ORM\Column(type: 'string')] private $email; // Getters and setters... } // Query example $users = $entityManager->getRepository(User::class)->findBy(['active' => true]);
[/sh_prismjs_pre]
Routes: Laravel vs Symfony
Laravel: Routes
In Laravel, le rotte vengono definite in file come web.php
o api.php
.
[sh_prismjs_pre class=”language-php” ]
use App\Http\Controllers\UserController; Route::get('/users', [UserController::class, 'index']);
Symfony: Routing
In Symfony, le rotte sono definite nei file YAML, XML o con annotazioni PHP.
[sh_prismjs_pre class=”language-php” ]
# config/routes.yaml users: path: /users controller: App\Controller\UserController::index
[/sh_prismjs_pre]
[sh_prismjs_pre class=”language-php” ]
namespace App\Controller; use Symfony\Component\Routing\Annotation\Route; class UserController { #[Route('/users', name: 'user_index')] public function index() { // ... } }
[/sh_prismjs_pre]
Policies (Laravel) vs Voter (Symfony)
Laravel: Policies
Le Policies in Laravel vengono utilizzate per gestire l’autenticazione degli utenti.
[sh_prismjs_pre class=”language-php” ]
<?php namespace App\Policies; use App\Models\User; use App\Models\Post; class PostPolicy { /** * Determina se il post specificato può essere aggiornato dall’utente. * * @param \App\Models\User $user * @param \App\Models\Post $post * @return bool */ public function update(User $user, Post $post): bool { return $user->id === $post->user_id; } }
[/sh_prismjs_pre]
Symfony: Voter
In Symfony, il concetto equivalente è realizzato tramite i Voter.
[sh_prismjs_pre class=”language-php” ]
<?php namespace App\Security\Voter; use Symfony\Component\Security\Core\Authorization\Voter\Voter; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; use Symfony\Component\Security\Core\Authorization\Voter\Attribute\Post; class PostVoter extends Voter { protected function supports(string $attribute, $subject): bool { return $attribute === 'POST_EDIT' && $subject instanceof Post; } protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool { $user = $token->getUser(); return $user->getId() === $subject->getUserId(); } }
[/sh_prismjs_pre]
Providers (Laravel) vs Symfony Services
Laravel: Providers
I Service Providers in Laravel sono utilizzati per registrare i servizi all’interno dell’applicazione. Ogni provider estende la classe ServiceProvider
e contiene metodi per configurare i servizi.
[sh_prismjs_pre class=”language-php” ]
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { public function register() { $this->app->bind('App\Contracts\ExampleContract', function ($app) { return new ExampleImplementation(); }); } public function boot() { // Code to bootstrap services... } }
[/sh_prismjs_pre]
Symfony: Services
In Symfony, l’equivalente dei Providers è il sistema di Dependency Injection attraverso il Service Container. I servizi vengono definiti nei file di configurazione (ad esempio, YAML o XML) o tramite attributi nella classe.
[sh_prismjs_pre class=”language-yaml” ]
# config/services.yaml services: App\Service\ExampleService: arguments: $dependency: '@App\Service\DependencyService'
[/sh_prismjs_pre]
[sh_prismjs_pre class=”language-php” ]
<?php namespace App\Service; class ExampleService { private $dependency; public function __construct(DependencyService $dependency) { $this->dependency = $dependency; } public function doSomething() { // ... } }
[/sh_prismjs_pre]
Invio Email: Laravel vs Symfony
Laravel: Invio Email
Laravel utilizza una sintassi semplice per inviare email con il supporto integrato per i driver di posta.
[sh_prismjs_pre class=”language-php” ]
Mail::to('user @ example.com')->send(new WelcomeEmail($user));
[/sh_prismjs_pre]
Symfony: Invio Email
Symfony utilizza il componente Mailer.
[sh_prismjs_pre class=”language-php” ]
use Symfony\Component\Mailer\MailerInterface; use Symfony\Component\Mime\Email; $email = (new Email()) ->from('hello @ example.com') ->to('user @ example.com') ->subject('Welcome!') ->text('Hello and welcome!'); $mailer->send($email);
[/sh_prismjs_pre]
Conclusione
Laravel e Symfony offrono strumenti potenti per la creazione di applicazioni web, ma si distinguono per approccio e terminologia. Scegliere il framework giusto dipende dalle esigenze specifiche del progetto e dalle preferenze personali del team.