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.
<?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á.
<?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.
$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.
<?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]);
}
}