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

1

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

Http://somedomain/блог /1/название

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

Http://somedomain/блог /1

Теперь я хочу перенаправить пользователя на правильный URL с помощью slug, например, в 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,
    ]);

}
Теги:
redirect
yii2
yii2-advanced-app

1 ответ

1

Правило, которое вы создали, не совпадает, поскольку пул не найден. Он просто обходит его.

Таким образом, вы можете использовать defaults по defaults -functionality для правила, чтобы один из параметров (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],
        ],            
    ],
],

Ещё вопросы

Сообщество Overcoder
Наверх
Меню