Как определять необязательные заполнители
Дата обновления перевода 2023-06-30
Как определять необязательные заполнители
Чтобы сделать всё более захватывающим, добавьте новый маршрут, который отображает список всех доступных записей блога для этого воображаемого приложения-блога:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
// src/Controller/BlogController.php
// ...
class BlogController extends Controller
{
// ...
/**
* @Route("/blog")
*/
public function index()
{
// ...
}
}
Пока этот маршрут настолько прост, насколько это возможно - он не содержит
заполнителей и будет соответствовать только точному URL /blog. Но что, если вам
нужно, чтобы этот маршрут поддерживал нумерацию страниц, где /blog/2 отображает
вторую страницу записей блога? Обновите маршрут так, чтобы в нем был новый заполнитель
{page}:
1 2 3 4 5 6 7 8 9 10 11
// src/Controller/BlogController.php
// ...
/**
* @Route("/blog/{page}")
*/
public function index($page)
{
// ...
}
Как и в заполнителе {slug} раньше, значение, соответствующее {page} будет
доступно внутри вашего контроллера. Его значение может быть использовано для
определения того, какой набор записей блога нужно отобразить для заданной страницы.
Но погодите-ка! Так как заполнители требуются по умолчанию, этот маршрут больше
не будет соответствовать просто /blog. Вместо этого, чтобы увидеть 1-ую страницу
блога, вам нужно использовать URL /blog/1! Так как это неподобающее поведение для
богатого веб-приложения, измените маршрут так, чтобы параметр {page} был необязательным.
Это делается путём включения его в коллекцию defaults:
1 2 3 4 5 6 7 8 9 10 11
// src/Controller/BlogController.php
// ...
/**
* @Route("/blog/{page}", defaults={"page"=1})
*/
public function index($page)
{
// ...
}
Добавляя page к ключу defaults, заполнитель {page} больше не
является обязательным. URL /blog ,удет соответствовать этому маршруту,
а значение параметра page будет установлено как 1. URL /blog/2
также будет соответствовать, предоставляя параметру page значение 2.
Идеально.
| URL | ??????? | ????????? |
|---|---|---|
/blog |
blog |
{page} = 1 |
/blog/1 |
blog |
{page} = 1 |
/blog/2 |
blog |
{page} = 2 |
Caution
Конечно же, у вас может быть больше одного необязательного заполнителя
(например, /blog/{slug}/{page}), но всё после необязательного заполнителя
также должно быть необязательным. Например, /{page}/blog - валидный путь, но
page всегда будет обязательным (т.е. просто /blog не будет соответствовать
этому маршруту).
Tip
Маршруты с необязательными параметрами в итоге не будут соответствовать
запросам с закрывающим слешем (т.е. /blog/ не будет соответствовать, а
/blog - будет).