Routing by Symfony

Ниже рассматриваю интересные случаи роутинга.

Только 2 значения будут обрабатываться:

#[Route('/backoffice/{type}', requirements: ['type' => '(foo|bar)'])]

альтернатива:

    #[Route(
        path: '/articles/{_locale}/search.{_format}',
        locale: 'en',
        format: 'html',
        requirements: [
            '_locale' => 'en|fr',
            '_format' => 'html|xml',
        ],
    )]
    public function search(): Response
    {
    }

Конфликтующая ситуация, решенная с помощью requirements:

срабатывает только если цифры в переменной id:
#[Route('/our/person/{id<\d+>}')]

срабатывает только если name не имеет значения person:
#[Route('/our/{name}/{slug}', methods: ['GET'], requirements: ['name' => '((?!person).+)'])]

Еще примерчики:

    @Route("/share/{token}", name="share", requirements={"token"=".+"})

    #[Route(
        '/contact',
        name: 'contact',
        condition: "context.getMethod() in ['GET', 'HEAD'] and request.headers.get('User-Agent') matches '/firefox/i'",
        // expressions can also include config parameters:
        // condition: "request.headers.get('User-Agent') matches '%app.allowed_browsers%'"
    )]
    public function contact(): Response
    {
        // ...
    }

    #[Route(
        '/posts/{id}',
        name: 'post_show',
        // expressions can retrieve route parameter values using the "params" variable
        condition: "params['id'] < 1000"
    )]
    public function showPost(int $id): Response
    {
        // ... return a JSON response with the post
    }

Даже так

use Symfony\Bundle\FrameworkBundle\Routing\Attribute\AsRoutingConditionService;
use Symfony\Component\HttpFoundation\Request;

#[AsRoutingConditionService(alias: 'route_checker')]
class RouteChecker
{
    public function check(Request $request): bool
    {
        // ...
    }
}
Then, use the service() function to refer to that service inside conditions:

 Copy
// Controller (using an alias):
#[Route(condition: "service('route_checker').check(request)")]
// Or without alias:
#[Route(condition: "service('App\\\Service\\\RouteChecker').check(request)")]

Предпочтения

Я предпочитаю писать просто

    /**
     * форма добавления/редактирование компании
     * @Route("/formCompany/", name="formCompany")
     * @Template()
     */
    public function formCompanyAction()
    {
        $id = (int)$request->get('id');

1. благодаря тому, что мы указали в конце роута слэш, симфони будет редиректить посетителя сайта с страницы /formCompany на страницу /formCompany/

2. как видите, я обрабатываю GET-параметр вручную и в большинстве случаев это удобнее, чем писать:

* @Route("/formCompany/{id}", defaults={"id" = 0}, name="formCompany")

потому что при дополнительном параметре, придется расширять роут-правило + это принесет ненужную нагрузку на парсер роутинга.

3. в месте, где нужно указать, какую строку мы будем изменять, мы напишем:

<a href="{{ url('formCompany', { id : 123 }, true) }}">Изменить</a>

true - здесь говорит о том, что id является GET-параметром, а не параметром роута.

Если нужен красивый URI

То придется в роуте прописать значение по-умолчанию

@Route("/formCompany/{id}", defaults={"id" = 0}, name="formCompany")

т.к. если не прописать defaults, то twig будет ругаться на построение пути без указания id:

{{ path('formCompany') }}

и будет прав, т.к. id является обязательным, поэтому придется написать:

{{ path('formCompany', { id : 123 }) }}

Удачки.


11.09.2021 07:08

Комментарии

Комментариев пока нет.


Copyrights © 2007 - 2026 YaPro.Ru