Как работают маршруты на Yii2?

Маршруты - это одна из ключевых концепций фреймворка Yii2, которая позволяет определить, как URL-адрес будет соответствовать контроллерам и действиям вашего приложения. Маршруты определяются в конфигурационном файле config/web.php или в отдельных модулях.

На Yii2 маршруты могут быть определены в двух форматах: массивы и строки.

Формат массивов:

В формате массивов маршруты определяются как ассоциативный массив, где ключи являются путем, а значения - строки, указывающие контроллер и действие.

Пример:

return [
    'post/index' => 'post/index',
    'post/view/<id:d+>' => 'post/view',
];

В приведенном выше примере, путь /post/index будет соответствовать действию index контроллера post, а путь /post/view/123 будет соответствовать действию view контроллера post, где 123 - это значение переменной id, ограниченное регулярным выражением d+.

Формат строки:

В формате строки маршруты определяются в виде строки, где контроллер и действие разделены косой чертой /.

Пример:

return [
    'post/index' => 'post/index',
    'post/view/<id:d+>' => 'post/view',
];

Этот пример имеет тот же результат, что и предыдущий.

Для более сложных маршрутов, вы можете использовать специальный синтаксис шаблонов для определения переменных и дополнительных параметров:

return [
    'post/index' => 'post/index',
    'post/view/<id:d+>' => 'post/view',
    'post/<action:(create|update|delete)>' => 'post/<action>',
    'post/<category:w+>/<id:d+>' => 'post/view',
];

В этом примере добавлены два дополнительных маршрута: /post/<action> будет соответствовать действиям create, update и delete контроллера post, а /post/<category>/<id> будет соответствовать действию view, где category может быть любым словом (w+), а id является числом.

Yii2 также предоставляет возможность создавать универсальные маршруты, которые могут соответствовать любым URL-адресам и перенаправлять их на определенные контроллеры и действия. Это достигается с использованием компонента UrlManager в конфигурационном файле приложения.

return [
    'components' => [
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
                '<controller:w+>/<action:w+>' => '<controller>/<action>',
            ],
        ],
    ],
];

В приведенном выше примере все URL-адреса вида /контроллер/действие будут перенаправлены на соответствующий контроллер и действие.