Routing

HTTP metodu, cestu a controller akci definujete v routingu. Z pojmenované routy lze generovat URL včetně parametrů.

Registrace rout

Routing.php vrací callback, kterému runtime předá Router. getNamed() zaregistruje GET /articles/{id} pod jménem articles.detail; ControllerAction::for() určí akci detail(). Hodnota segmentu {id} se předá stejnojmennému argumentu akce. Jméno routy později poslouží ke generování odkazu.

app/Config/Routing.php
<?php

declare(strict_types=1);

use App\Controllers\ArticleController;
use Lemonade\Framework\Routing\ControllerAction;
use Lemonade\Framework\Routing\Router;

return static function (Router $router): void {
    $router->getNamed(
        'articles.detail',
        '/articles/{id}',
        ControllerAction::for(ArticleController::class, 'detail'),
    );
};

Metody a parametry

Router rozlišuje HTTP metody samostatnými metodami get(), post(), put(), patch() a delete(). ArticleController přijme {id} z GET routy jako argument detail(); store() obslouží POST routu z dalšího souboru a vrátí JSON se statusem 201. Tato ukázka data neukládá.

app/Controllers/ArticleController.php
<?php

declare(strict_types=1);

namespace App\Controllers;

use Lemonade\Framework\Http\Response\Responses;
use Lemonade\Framework\View\ViewRendererInterface;
use Psr\Http\Message\ResponseInterface;

final readonly class ArticleController
{
    public function __construct(
        private ViewRendererInterface $views,
        private Responses $responses,
    ) {}

    public function detail(string $id): ResponseInterface
    {
        return $this->views->render('articles.detail', ['id' => $id]);
    }

    public function store(): ResponseInterface
    {
        return $this->responses->json(['status' => 'created'], 201);
    }
}

Do stejného callbacku v Routing.php patří POST /articles pro store() a samostatná GET cesta /articles/featured/{id}. constrainParameter() povolí pouze hodnoty 1 a 2; přijímá seznam hodnot, nikoli regulární výraz.

app/Config/Routing.php
$router->postNamed(
    'articles.store',
    '/articles',
    ControllerAction::for(ArticleController::class, 'store'),
);
$router->get('/articles/featured/{id}', ControllerAction::for(ArticleController::class, 'detail'))
    ->constrainParameter('id', ['1', '2']);

Odkazy podle jména

ArticleLinks přijme UrlGenerator konstruktorem a odkaz sestaví z názvu articles.detail. Předané id vyplní segment {id}; další parametry by se připojily jako query string. Při změně cesty routy není třeba měnit volající kód.

ArticleLinks.php
<?php

declare(strict_types=1);

use Lemonade\Framework\Routing\UrlGenerator;

final readonly class ArticleLinks
{
    public function __construct(private UrlGenerator $urls) {}

    public function detail(int $id): string
    {
        return $this->urls->route('articles.detail', ['id' => $id]);
    }
}
Související dokumentaceVíce informací najdete v kapitole Routing a URL v dokumentaci.

← Všechny ukázky