0

假设我们有一个名为“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
}

所以我的问题是:

在运行时自动生成类是个好主意吗?

4

1 回答 1

0

在运行时生成 php 代码可以工作,但不是最好的解决方案恕我直言。您应该使用某种表继承。

更多信息:

http://www.yiiframework.com/wiki/198/single-table-inheritance/ http://learnyii.blogspot.hu/2012/04/yii-table-inheritance-single-active.html

于 2013-10-28T15:03:18.060 回答