2013-01-23 77 views
0

“一些常用的功能,如用户管理,评论管理,可能会根据模块进行开发,以便它们可以在未来的项目中轻松重复使用。” - http://www.yiiframework.com/doc/guide/1.1/en/basics.module模块依赖关系和关系

我有很多需要用户的项目。每次都有相同的数据库结构和功能。注册,登录,注销等。 Yii告诉我,我可以重用模块。酷...让我们开始吧:

我有3个部分:用户,市场活动和网站。

在该项目中的CampaignModule具有与UserModule的关系(campaign_user [USER_ID,CAMPAIGN_ID])

的WebsiteModule具有相对于所述CampaignModule和所述UserModule。

我想重用与像注册功能,在其他项目中UserModule,登录,编辑等

实际情况: 与GII创建模型每个人都有跨模块关系和依赖关系之后。 例如

UserModule: 'campaigns' => array(self::HAS_MANY, 'Campaign', 'user_id'), 

要使用WebsiteModule,需要包含User-和CampaignModule。 现在我甚至必须包含Website-和CampaignModule才能使用UserModule!

我也想更新许多项目的UserModule,也许建立一个基本模块的框架。

什么是正确的方式来规划这样的架构?

回答

1

有一个yii-user module,他们做什么,是他们让你来指定用户模型的其他关系,对模块配置:

/** 
* @return array relational rules. 
*/ 
public function relations() 
{ 
    $relations = Yii::app()->getModule('user')->relations; 
    if (!isset($relations['profile'])) 
     $relations['profile'] = array(self::HAS_ONE, 'Profile', 'user_id'); 
    return $relations; 
} 

所以,你可以这样做:

'modules'=>array(
    'user' => array(
      ... 
      'relations' => array(
       'categories' => array(CActiveRecord::HAS_MANY, 'Category', "user_id"), 
       'account' => array(CActiveRecord::HAS_ONE, 'Account', "user_id"), 
      ), 
      ... 
     ), 
), 
+1

这是一个很好的关系解决方案。但我仍然有一个问题找到模块的全球解决方案。如果WebsiteModule具有WebsiteRatingModel,我不想在我的应用程序或其他模块中使用WebsiteRating :: model() - > ...。我想通过一个接口或一种API与模型进行通信。编写Yii :: app() - > getModule('website') - > website-> getWebsiteRating(123)不是最好的主意......( - >网站是在模块init()中设置的组件集合) –