Yii2, если указан только параметр id, перенаправление на id plus slug

Моя текущая настройка имеет следующую структуру URL

http://somedomain/blog/1/title

Если часть заголовка слага неверна, он будет перенаправлен на правильный слаг, однако, если вы введете следующий URL-адрес, вы получите 404 (слаг не указан):

http://somedomain/blog/1

Теперь я хочу перенаправить пользователя на правильный URL-адрес с помощью слага, например, в stackoverflow, если вы введете https://stackoverflow.com/users/1917403 если добавит мое имя пользователя в конец.

URL-менеджер

    'urlManager' => [
        'class' => 'yii\web\UrlManager',
        'enablePrettyUrl' => true,
        'showScriptName' => false,
        'rules' => [
            'blog/<id:\d+>/<slug:[-a-zA-Z 0-9]+>' => 'blog/view',
        ],
    ],

И вот мое действие просмотра контроллера

public function actionView($id, $slug = null)
{

    $model = $this->findModel($id);
    $model->author_info = json_decode($model->author_info, true); 

    if ($slug != $model->slug) {
        return $this->redirect(['blog/view', 'id' => $id, 'slug' => $model->slug]);
    }

    return $this->render('view', [
        'model' => $model,
    ]);

}

person Connor Brough    schedule 28.05.2015    source источник


Ответы (1)


Созданное вами правило не соответствует, так как слаг не найден. Он просто обойдет его.

Таким образом, вы можете использовать defaults-функциональность для правила сделать один из параметров (в данном случае slug) необязательным или просто указать второе правило без части slug.

Примером решения 1 будет:

'urlManager' => [
    'class' => 'yii\web\UrlManager',
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [ 
        [
           'pattern' => 'blog/<id:\d+>/<slug:[-a-zA-Z 0-9]+>',
           'route' => 'blog/view',
           'defaults' => ['slug' => null],
        ],            
    ],
],
person Blizz    schedule 29.05.2015