我正在尝试使用 Yii 制作一个类似 cms 的应用程序。该功能将类似于:
http://www.example.com/article/some-article-name
我想要做的是让一切都actionIndex()
按照ArticleController.php
. 所以我的问题是如何将所有操作路由到 Yii 控制器中的一个方法?
我正在尝试使用 Yii 制作一个类似 cms 的应用程序。该功能将类似于:
http://www.example.com/article/some-article-name
我想要做的是让一切都actionIndex()
按照ArticleController.php
. 所以我的问题是如何将所有操作路由到 Yii 控制器中的一个方法?
在您的情况下,我认为使用filter或beforeAction
method会更好。
过滤方式:
过滤器是一段代码,配置为在控制器操作执行之前和/或之后执行。
样本:
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
}
在配置中 urlManager 规则的开头添加:
'article/*' => 'article',
我猜您只是想在“视图”文件夹中放入一堆静态页面,并让它们自动选择和呈现,而无需在控制器中为每个页面添加操作。
上面建议的 filters() 和 beforeAction() 甚至 __construct() 都不适用于此目的(如果操作不存在,则过滤器和 beforeaction 根本不会启动,并且 __construct 非常混乱,因为如果您将功能放入__construct - 那时 Yii 甚至不知道它应该调用哪个控制器/动作/视图)
但是,有一个涉及 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 内容。
您的规则必须类似于以下内容:-
'rules' => array(
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>' => 'article/index',
),
如果 Controller 和/或 Action 不存在,这会将所有请求传递给PHP 类actionIndex
中的函数。ArticleController