Как определять необязательные заполнители

Дата обновления перевода 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 - будет).