我正在尝试使用Yii创建像app这样的cms。功能将类似于:
http://www.example.com/article/some-article-name
我要做的是让所有内容都放在actionIndex()
中的ArticleController.php
方法中,让一种方法确定如何处理操作。所以我的问题是如何将所有操作路由到Yii中控制器中的一个方法?
答案 0 :(得分:2)
在您的情况下,我认为最好使用filter或beforeAction
method。
过滤方式:
Filter是一段代码,配置为在执行控制器操作之前和/或之后执行。
样品:
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
}
答案 1 :(得分:0)
在config:
中的urlManager规则的开头添加它'article/*' => 'article',
答案 2 :(得分:0)
您的规则必须类似于以下内容: -
'rules' => array(
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>' => 'article/index',
),
如果Controller和/或Action不存在,这会将所有请求传递给actionIndex
PHP类中的ArticleController
函数。
答案 3 :(得分:0)
我猜你只想在你的&#34;视图&#34;中扔掉一堆静态页面。文件夹并自动选择和渲染它们,而无需在控制器中为每个文件夹添加操作。
以上建议的filters()和beforeAction()甚至__construct()不能用于此目的(如果操作不存在,则过滤器和beforeaction根本不会启动,并且__construct非常混乱,因为如果你把你在__construct中的功能 - 那时Yii甚至不知道它应该调用哪个控制器/动作/视图)
但是,有一个简单的解决方法,涉及URL管理器
在您的配置中,在网址管理员的规则中,添加以下一行(取决于您的路径设置)
'articles/<action:\w+>' => 'articles/index/action/<action>',
OR
'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内容。