簡體   English   中英

Yii2路由規則相互沖突

[英]Yii2 Routing rules conflicts with each other

我有以下2條規則:

'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

它可以正常工作,但是當我嘗試訪問此URL(例如,Slug URL)時:

/blog/test-test-test

我會得到一個錯誤:

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

因為正在分析第一條規則,而不是第二條規則。 例如,我嘗試將它們反向,但是它沒有用(總是不能使用),還嘗試了其他方案,但沒有成功

知道如何使它起作用嗎?

我建議首先不要對兩個操作使用相同的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])
}

注意 :這僅是如何操作( 或如何操作 )的示例。 不要在任何生產環境中運行我糟糕的,未經測試的代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM