Yii2如果只提供id参数重定向到id加slug

时间:2015-05-28 22:56:13

标签: php redirect yii2 yii2-advanced-app

我当前的设置具有以下网址结构

http://somedomain/blog/1/title

如果slug标题部分错误,它将重定向到正确的slug但是如果您输入以下url,则会得到404(没有提供slug):

http://somedomain/blog/1

现在我想用slug将用户重定向到正确的URL,例如在stackoverflow上如果输入https://stackoverflow.com/users/1917403,如果将我的用户名添加到最后。

网址管理员

    '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,
    ]);

}

1 个答案:

答案 0 :(得分:1)

由于未找到slug,因此您创建的规则不匹配。它会绕过它。

因此,您可以使用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],
        ],            
    ],
],