我有以下两条规则:
'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
因为正在解析第一条规则而不是第二条规则。 我试图改变它们,例如但它没有工作(总是一个不起作用),也试过其他情况但没有成功
知道如何让它有效吗?
答案 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])
}
注意:这只是一个如何(或如何不?)的示例。不要在任何生产环境中运行我未经测试的糟糕代码