2

我正在尝试使用 Yii 制作一个类似 cms 的应用程序。该功能将类似于:

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

我想要做的是让一切都actionIndex()按照ArticleController.php. 所以我的问题是如何将所有操作路由到 Yii 控制器中的一个方法?

4

4 回答 4

2

在您的情况下,我认为使用filterbeforeActionmethod会更好。


过滤方式:

过滤器是一段代码,配置为在控制器操作执行之前和/或之后执行。

样本:

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 
}
于 2012-12-19T05:51:00.503 回答
0

在配置中 urlManager 规则的开头添加:

'article/*' => 'article',
于 2012-12-16T20:23:26.463 回答
0

我猜您只是想在“视图”文件夹中放入一堆静态页面,并让它们自动选择和呈现,而无需在控制器中为每个页面添加操作。

上面建议的 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 内容。

于 2014-10-18T04:44:31.340 回答
0

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

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

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

于 2013-08-28T12:01:59.577 回答