假设我们有一个名为“UsersModule”的模块,其中包含以下模型:
class User extends CActiveRecord
{
// Some code here
}
我们在不同的应用程序中使用这个模块,有时我们想扩展用户模型来添加一些自定义方法或属性。此外,我们经常希望更改数据库中的表以将这些新属性存储在其中。但是我们不想更改 UsersModule 本身的代码,因为它来自主存储库(例如 GitHub),当我们修复其中的一些错误时,我们只想从我们所有项目的存储库中更新这个模块。同时,我们要保存为项目所做的自定义更改。所以我们有以下想法:
在 UsersModule.php 中,我们执行以下操作:
class UsersModule extends CWebModule
{
public $usersBaseClass = 'UsersBase';
}
在用户.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
}
所以我的问题是:
在运行时自动生成类是个好主意吗?