模块化Yii组件/操作

时间:2014-04-15 17:42:53

标签: php yii modularity

我正在使用Yii框架,对于我们的网站,我们希望使其更加模块化。这对我们意味着我们想要将一些组件的逻辑分离到它们自己的组件/ app文件夹中。

目前我正在做的是使用我自己的每个Controller类扩展CController。

e.g。

class SiteController extends MyController

在MyController中,我将通过actions()方法加载组件:

public function actions() {
    return array(
        'login'=>array(
            'class'=>'application.components.Auth',
        ),
        'logout'=>array(
            'class'=>'application.components.Auth',
        ),
    );
}

在我的Auth组件中,我有一个run()方法:

public function run() {
//  Get the action string from the URL
    $uri = (Yii::app()->getRequest()->getRequestUri());
    $method = 'action'.ucfirst(substr($uri,strrpos($uri,'/')+1));

//  Run the method from the URI
    $this->$method();
}

这将运行我在Auth组件中的操作方法。我还应该提一下,我的Auth组件不扩展CWidget,它扩展了CAction。

Inside Auth我有我的方法:actionLogin()和actionLogout()来匹配MyController中的上述操作。

当我尝试渲染我希望保留在模块化组件中的视图文件时,它不会识别组件文件夹中有视图文件,而是查看默认视图或主题文件夹。

我试图从受保护的root加载传递:'// application / components / auth / login'

注意:的 尝试这样做的总体目标是让我能够创建我的站点的多个模块化部分/应用程序/组件,其中URL结构不会更改,并且基于我如何设置操作方法数组,它将加载该URL的特定组件。我可能在网站上有两种形式的身份验证,或者未来的组件可能是根据我在actions数组中放置的内容来设置每周计划和每月计划组件的能力。

我调查了模块,但我发现网址不会保持一致。我欢迎任何有关这方面的建议。谢谢。

1 个答案:

答案 0 :(得分:0)

首先,在组件中创建一个列出本地操作处理程序的函数

public static function actions(){
    return array(
        // name action and point to the location where the action class is
        'GetActivity'       =>'application.components.Auth.login',
        'GetActivitytype'   =>'application.components.Auth.logout',
    );
}

按如下方式加载您的观看次数: -

return $this->renderPartial('application.components.views.auth_login',
                             array('model'    => $userModel),
                             true
                           );