2013-10-28 30 views
0

讓我們假設,我們稱之爲「UsersModule」模塊,在它下面的模型:在yii框架中運行時生成類是個壞主意?

class User extends CActiveRecord 
{ 
    // Some code here 
} 

我們在不同的應用中使用這個模塊和一定的時間,我們希望擴展用戶模型中加入一些自定義的方法或屬性它。更重要的是,我們通常希望更改數據庫中的表以將新的屬性存儲在其中。但是我們不想在UsersModule本身中更改代碼,因爲它來自主存儲庫(例如,GitHub),當我們修復其中的一些錯誤時,我們只想從所有項目中的存儲庫更新此模塊。同時,我們希望保存爲項目所做的自定義更改。因此,我們有以下想法:

在UsersModule.php我們執行下列操作:

class UsersModule extends CWebModule 
{ 
    public $usersBaseClass = 'UsersBase'; 
} 

在Users.php:

$extendClass = Yii::app()->getModule('users')->usersBaseClass; 
$version = '1.0'; 


$usersFile = Yii::getPathOfAlias('application.runtime').'/Users_extends_'.$extendClass.'_v'.$version.'.php'; 
if(!file_exists($usersFile)) { 
    $code =<<<PHP 
<?php 
/** 
* This is the model class for table "{{users}}". 
*/ 
class Users extends {$extendClass} 
{ 
    /** 
    * Returns the static model of the specified AR class. 
    * @param string \$className active record class name. 
    * @return Users the static model class 
    */ 
    public static function model(\$className=__CLASS__) 
    { 
     return parent::model(\$className); 
    } 
} 
PHP; 
    file_put_contents($usersFile, $code); 
} 
if(!class_exists('Users', flase)) 
    require_once($usersFile); 

而且我們介紹UsersBase.php:

class UsersBase extends CActiveRecord 
{ 
    // All base Users model logic is here 
} 

因此,當我們在應用程序的某處使用Users類時,我們在Users.php中的代碼會生成真正的Users類,找到所需的基類。在當我們要擴大我們的用戶模型中,我們可以做以下各項目:該項目的

在CONFIGS/main.php:

'modules' => 
    'users => array(
     'usersBaseClass' => 'MyUsers' 
    ) 

而且我們在我們的應用程序中添加一些MyUsers.php哪裏:

class MyUsers extends UsersBase 
{ 
    // All the custom logic goes here 
} 

所以我的問題是:

這是個好主意,生成類在運行時自動或不?

回答