Предоставлено
Владимир Лучанинов
в № 29599.

В приложениях Symfony вы можете дать заполнителям маршрута значение по умолчанию, чтобы их можно было опустить в сгенерированном URL-адресе. Рассмотрим это определение маршрута:

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;

class BlogController extends AbstractController
{
    /**
     * @Route("/blog/{page}", name="blog_list")
     */
    public function list($page = 1)
    {
        // ...
    }
}

Если вы не укажете значение переменной page при создании URL для маршрута blog_list, результирующий URL будет /blog, а значение заполнителя page будет 1:

$router = ... // a UrlGeneratorInterface instance

$url = $router->generate('blog_list');                // /blog
$url = $router->generate('blog_list', ['page' => 1]); // /blog/1
$url = $router->generate('blog_list', ['page' => 7]); // /blog/7

Хотя это желательное поведение в большинстве приложений, иногда вы можете предпочесть всегда включать значение заполнителя, даже если вы не указываете его при создании URL. В Symfony 4.3 мы сделали это возможным с помощью нового синтаксиса для заполнителей маршрута:

/**
 * @Route("/blog/{!page}", name="blog_list")
 */
public function list($page = 1)
{
    // ...
}

Символ ! перед именем заполнителя указывает Symfony всегда включать его значение в сгенерированный URL, независимо от того, является ли это значением по умолчанию:

$url = $router->generate('blog_list');                // /blog/1
$url = $router->generate('blog_list', ['page' => 1]); // /blog/1
$url = $router->generate('blog_list', ['page' => 7]); // /blog/7