2013-10-28 4 views
0

Давайте предположим, что мы модуль, который называется «UsersModule» со следующей моделью в нем:Создание классов во время выполнения в структуре yii - плохая идея?

class User extends CActiveRecord 
{ 
    // Some code here 
} 

Мы используем этот модуль в различных приложениях и некоторое время мы хотим расширить модель пользователя, чтобы добавить некоторые пользовательские методы или свойства Это. Более того, часто мы хотим изменить таблицы в базе данных, чтобы сохранить в ней новые свойства. Но мы не хотим изменять код в самом UserModule, потому что он исходит из главного репозитория (GitHub для ex.), И когда мы исправляем некоторые ошибки, мы хотим просто обновить этот модуль из репозитория во всех наших проектах. В то же время мы хотим сохранить пользовательские изменения, сделанные для проектов. Таким образом, мы имеем следующую мысль:

В 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 генерирует класс реальных пользователей, который e xtends желаемый базовый класс. В каждом проекте, когда мы хотим расширить нашу модель Users мы можем сделать следующее:

В конфиги/main.php проекта:

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

А также мы добавим MyUsers.php некоторые где в нашем приложении :

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

Так что мой вопрос:

это хорошая идея, чтобы генерировать классы автоматически во время выполнения или нет?

ответ

Смежные вопросы