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.
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);
}
}
<?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'));
}
}
}
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();
<?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]);
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()
{
// ...
}
}
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();
}
}
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...
}
}
# 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()
{
// ...
}
}
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));
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);
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.