Yii将所有动作路由到控制器中的一个方法

e5njpo68  于 2022-11-09  发布在  其他
关注(0)|答案(4)|浏览(140)

我正在尝试用Yii做一个类似cms的应用程序。功能是这样的:
http://www.example.com/article/some-article-name
我所要做的是让所有的动作都通过ArticleController.php中的actionIndex()方法,并让这个方法决定如何处理动作。所以我的问题是如何在Yii中将所有的动作路由到控制器中的一个方法?

bpzcxfmw

bpzcxfmw1#

在您的情况下,我认为使用过滤器或beforeAction方法会更好。
筛选方式:
过滤器是被配置为在控制器动作执行之前和/或之后执行的一段代码。
样品:

class SomeController extends Controller {
    // ... other code ...

    public function filters() {
        return array(
            // .. other filters ...
            'mysimple', // our filter will be applied to all actions in this controller
            // ... other filters ...
        );
    }

    public function filterMysimple($filterChain) { // this is the filter code
        // ... do stuff ...
        $filterChain->run(); // this bit is important to let the action run
    }

    // ... other code ...
}

beforeAction方式:
此方法是在即将执行操作之前调用的(在所有可能的筛选器之后)。您可以重写此方法,以便为操作做最后的准备。
样品:

class SomeController extends Controller {
    // ... other code ...

    protected function beforeAction($action) {
        if (parent::beforeAction($action)){

            // do stuff

            return true; // this line is important to let the action continue
        }
        return false;
}

    // ... other code ...
}

顺便说一下,您也可以通过以下方式访问控制器中的当前操作:$this->action,以获得id的值:$this->action->id

if($this->action->id == 'view') { // say you want to detect actionView
    $this->layout = 'path/to/layout'; // say you want to set a different layout for actionView 
}
t1qtbnec

t1qtbnec2#

在配置中urlManager规则的开头添加以下内容:

'article/*' => 'article',
nkcskrwz

nkcskrwz3#

您的规则必须与以下内容类似:-

'rules' => array(
            '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
            '<controller:\w+>/<action:\w+>' => 'article/index',
        ),

如果控制器和/或操作不存在,这会将所有请求传递给ArticleController PHP类中的actionIndex函数。

goqiplq2

goqiplq24#

我猜您只是想在“视图”文件夹中放入一堆静态页面,并自动选择和呈现它们,而无需在控制器中为每个页面添加操作。
上面建议的filters()和beforeAction(),甚至__construct()都不适用于这个目的(如果action不存在,filters和beforeaction根本不会启动,而且__construct非常混乱,因为如果你把你的功能放在__construct中--在这一点上,Yii甚至不知道它应该调用哪个控制器/action/视图)
但是,有一个简单的解决方法,它涉及URL管理器
在配置的URL管理器规则中,添加以下行之一(取决于路径设置)

'articles/<action:\w+>' => 'articles/index/action/<action>',

'articles/<action:\w+>' => 'articles/index?action=<action>',

然后在你的文章控制器中就可以进行这个(或类似的)索引操作

public function actionIndex() {
    $name = Yii::app()->request->getParam('action');
    $this->render($name);
}

那么你就可以调用像/articles/myarticle或/articles/yourarticle这样的页面,而不需要在你的控制器中添加任何函数,你所需要做的就是在你的views/articles文件夹中添加一个名为myarticle.php或yourarticle.php的文件,然后在这些文件中输入你的html内容。

相关问题