Laravel vs Symfony – Klíčové koncepty a terminologie - Vývoj software a webových aplikací

Vývoj software a webových aplikací

Laravel vs Symfony – Klíčové koncepty a terminologie

Laravel vs Symfony - Klíčové koncepty a terminologie

Symfony a Laravel jsou dva velmi populární PHP frameworky, z nichž každý má svůj vlastní přístup a terminologii. V tomto článku porovnávám hlavní koncepty Laravelu s jejich ekvivalenty v Symfony a nabízím ukázky kódu pro každý případ.

Middleware (Laravel) vs Event Subscriber (Symfony)

Laravel: Middleware
Middleware v Laravelu jsou třídy, které filtrují HTTP požadavky. Mohou být použity pro úkoly, jako je autentizace nebo logování.

<?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);
    }
}

Symfony: Event Subscriber
V Symfony se podobný koncept realizuje pomocí Event Subscriberů nebo Kernel Events, které umožňují manipulovat s požadavky a odpověďmi.
<?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'));
        }
    }
}

Eloquent ORM (Laravel) vs Doctrine ORM (Symfony)

Laravel: Eloquent ORM
Laravel používá Eloquent jako ORM pro práci s databází prostřednictvím Active Record.

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    protected $fillable = ['name', 'email', 'password'];
}

// Příklad dotazu
$users = User::where('active', true)->get();

Symfony: Doctrine ORM
Symfony používá Doctrine jako ORM, který je založen na vzoru Data Mapper.
<?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;

    // Gettery a settery...
}

// Příklad dotazu
$users = $entityManager->getRepository(User::class)->findBy(['active' => true]);

Routes: Laravel vs Symfony

Laravel: Routes
V Laravelu jsou trasy definovány v souborech, jako web.php nebo api.php.

<?php

use App\Http\Controllers\UserController;

Route::get('/users', [UserController::class, 'index']);

Symfony: Routing
V Symfony jsou trasy definovány v souborech YAML, XML nebo pomocí PHP anotací.

# config/routes.yaml
users:
    path: /users
    controller: App\Controller\UserController::index
<?php

namespace App\Controller;

use Symfony\Component\Routing\Annotation\Route;

class UserController
{
    #[Route('/users', name: 'user_index')]
    public function index()
    {
        // ...
    }
}

Policies (Laravel) vs Voter (Symfony)

Laravel: Policies
Policies v Laravelu se používají k řízení autentizace uživatelů.

<?php

namespace App\Policies;

use App\Models\User;

class PostPolicy
{
    public function update(User $user, Post $post)
    {
        return $user->id === $post->user_id;
    }
}

Symfony: Voter
V Symfony je obdobný koncept realizován pomocí Voterů.

<?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();
    }
}

Providers (Laravel) vs Symfony Services

Laravel: Providers
Service Providers v Laravelu se používají k registraci služeb v aplikaci. Každý provider rozšiřuje třídu ServiceProvider a obsahuje metody pro konfiguraci služeb.

<?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()
    {
        // Kód pro inicializaci služeb...
    }
}

Symfony: Services
V Symfony je obdobou Providers systém Dependency Injection prostřednictvím Service Container. Služby jsou definovány v konfiguračních souborech (např. YAML nebo XML) nebo pomocí atributů ve třídě.

# config/services.yaml
services:
    App\Service\ExampleService:
        arguments:
            $dependency: '@App\Service\DependencyService'
<?php

namespace App\Service;

class ExampleService
{
    private $dependency;

    public function __construct(DependencyService $dependency)
    {
        $this->dependency = $dependency;
    }

    public function doSomething()
    {
        // ...
    }
}

Odesílání e-mailů: Laravel vs Symfony

Laravel: Odesílání e-mailů
Laravel používá jednoduchou syntaxi pro odesílání e-mailů s podporou vestavěných poštovních ovladačů.

Mail::to('user @example.com')->send(new WelcomeEmail($user));

Symfony: Odesílání e-mailů
Symfony používá komponentu Mailer.
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);

Závěr

Laravel a Symfony nabízejí silné nástroje pro tvorbu webových aplikací, ale liší se přístupem a terminologií. Výběr správného frameworku závisí na specifických potřebách projektu a preferencích týmu.

Štítky: ,