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

时间:2012-12-16 18:09:10

标签: php routing yii

我正在尝试使用Yii创建像app这样的cms。功能将类似于:

http://www.example.com/article/some-article-name

我要做的是让所有内容都放在actionIndex()中的ArticleController.php方法中,让一种方法确定如何处理操作。所以我的问题是如何将所有操作路由到Yii中控制器中的一个方法?

4 个答案:

答案 0 :(得分:2)

在您的情况下,我认为最好使用filterbeforeAction 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内容。