0

次のモデルを含む「UsersModule」というモジュールがあるとします。

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 クラスを生成します。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 に答える