Ниже рассматриваю интересные случаи роутинга.
Только 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 }) }}
Удачки.
Комментарии
Комментариев пока нет.