#php #symfony
Вопрос:
Я бы хотел, чтобы мой контроллер работал для всего, кроме url ‘abc’.
/**
* @Route(path="/api/{url}", name="test", requirements={"url"=". "})
*/
public function index(string $url)
{
...
}
Как мне преобразовать URL-адрес регулярного "url"=". "
выражения для такого, чтобы он был доступен всем, кроме ‘abc’?
Ответ №1:
Параметр requirements определяет регулярные выражения PHP, которым должны соответствовать параметры маршрута, чтобы весь маршрут соответствовал.
В вашем случае вы хотите разрешить все, кроме определенной строки.
Просто используйте обычное регулярное выражение using ^((?!abc).)*$
, если вы не хотите , чтобы ваш параметр url содержал строку abc
.
Знайте, что
abcde
иначеdabc
это не сработает.
Таким образом, ваш маршрут будет
/**
* @Route(path="/api/{url}", name="test", requirements={"url"="^((?!abc).)*$*"})
*/
public function index(string $url)
{
//allow foo
//allow bar
//block abc
//block fooabc
//block barabc
}
Если вы хотите, чтобы строка содержала abc, измените свое регулярное выражение на b(?!abcb)w
:
/**
* @Route(path="/api/{url}", name="test", requirements={"url"="b(?!abcb)w "})
*/
public function index(string $url)
{
//allow foo
//allow bar
//block abc
//allow fooabc
//allow barabc
}
Обратите внимание, что вы также можете добавить больше слов b(?!foo|barb)w
: