Yii2路由规则相互冲突

时间:2017-08-21 21:30:47

标签: php routes yii2

我有以下两条规则:

'blog/<action>' => 'blog/default/<action>',
'blog/<slug:[0-9a-zA-Z\-.]+>' => 'blog/default/view',

此外,我还有以下行动:

public function actionCheckSlug($slug) {

}

public function actionCreate() {

}

public function actionView($slug) {
    return $this->render("view");
}

当我尝试访问此URL时(例如,操作URL):

/blog/check-slug?slug=test

它没有任何问题,但是当我尝试访问此网址时(Slug网址):

/blog/test-test-test

我会收到错误:

yii\base\InvalidRouteException: Unable to resolve the request: blog/default/test-test-test

因为正在解析第一条规则而不是第二条规则。 我试图改变它们,例如但它没有工作(总是一个不起作用),也试过其他情况但没有成功

知道如何让它有效吗?

1 个答案:

答案 0 :(得分:0)

我建议首先不要对两个动作使用相同的URL约定

'blog/<action>' => 'blog/default/<action>',
'blog/<slug:[0-9a-zA-Z\-.]+>' => 'blog/default/view',

很容易变成

'blog/<action>' => 'blog/default/<action>',
'post/<slug:[0-9a-zA-Z\-.]+>' => 'blog/default/view',

或使用'blog/page-<slug:[0-9a-zA-Z\-.]+>'blog/post/ ..或者实际上只是与现有结构不冲突的任何约定

如果那不是你想做的事,还是不能做?在您的应用程序中,您可以使用slug来检查现有的应用程序结构。

public function view($slug){
    $model = $this->findBySlug($slug);
    return $this->render('view', ['model' => $model]);
}

private function findBySlug($slug){
    if ($this->hasMethod('action' . Inflector::classify($slug)) 
        // this should prevent recursion
        && $slug != $this->action->id){
        $this->runAction($slug);
        return null;
    }
    return Post::find()->where(['slug' => $slug])
}

注意:这只是一个如何(或如何不?)的示例。不要在任何生产环境中运行我未经测试的糟糕代码

相关问题