Як визначати необовʼязкові заповнювачі

Дата оновлення перекладу 2023-06-22

Як визначати необовʼязкові заповнювачі

Щоб зробити все більш захоплюючим, додайте новий маршрут, який відображає список усіх доступних записів блогу для цього уявного додатка-блогу:

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 - буде).