Давайте предположим, что мы модуль, который называется «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
}
Так что мой вопрос:
это хорошая идея, чтобы генерировать классы автоматически во время выполнения или нет?