0

私はしばらくの間、正常に自動ロードされるDoctrine_Recordクラスを使用してきました。しかし、少し読んだ後、Doctrine_Recordsとカスタムテーブルクラスの両方を実装することにしました。

だから私はこれを私のブートストラップに追加しました

    $manager->setAttribute(
        Doctrine::ATTR_AUTOLOAD_TABLE_CLASSES,
        true
    );

これにより、カスタムテーブルクラスが正常に機能するようになりました...しかし、レコードの自動読み込みが機能しなくなります。

両方を自動ロードするにはどうすればよいですか?

IEの新しいUser.phpは私のUserDoctrine_Recordクラスを取得し、Doctrine_Core :: getTable('User')は私のカスタムUserTableクラスを取得します。

カスタムテーブルを実装しようとする前の外観(動作)は次のとおりです。

public function _initDoctrine() {
        require_once 'Doctrine.php';
        /*
         * Autoload Doctrine Library and connect
         * use appconfig.ini doctrine.dsn
         */
        $this   ->getApplication()
                ->getAutoloader()
                ->pushAutoloader(array(
                                'Doctrine',
                                'autoload'),
                                'Doctrine');
        $manager = Doctrine_Manager::getInstance();
        $manager->setAttribute(
            Doctrine::ATTR_AUTO_ACCESSOR_OVERRIDE, 
            true
        );

        $manager->setAttribute(
            Doctrine::ATTR_MODEL_LOADING,
            Doctrine::MODEL_LOADING_CONSERVATIVE
        );
            // try these custom tables out!
        // $manager->setAttribute( Doctrine::ATTR_AUTOLOAD_TABLE_CLASSES, true );

        $config = $this->getOption('doctrine');
        $conn = Doctrine_Manager::connection($config['dsn'], 'doctrine');
        return $conn;
        // can call flush on the connection to save any unsaved records
    }

ありがとう


編集:

はっきりさせておきます。

カスタムクラスだけでなく、Doctrine_Recordを拡張するカスタムクラスをすでに使用しています。

class Model_User extends Doctrine_Record {}

$foo = new Model_User;

私のアプリケーションの多くは現在これを回避しており、その点で変更されることはありません。

ただし、カスタムテーブルも使用したいと思います

class UserTable extends Doctrine_Table {}

$bar = Doctrine_Core::getTable('User');

しかし、この(カスタムテーブルクラス)機能を有効にするとすぐに、テーブルサフィックスを利用してDoctrine_Tableのクラスを呼び出すことができます。以前に拡張して直接呼び出したDoctrine_Recordクラスは、機能しなくなります。両方を活用したい!

4

2 に答える 2

0

カスタムクラスに関する問題はよくわかりませんが、いずれにせよ、mysqlとUTF-8を使用したZFでのDoctrine1.2.4のブートストラップです。require()を必要とせず、すべてのモデルを完璧にロードします。

protected function _initDoctrine()
{
    $this->getApplication()->getAutoloader()
                           ->pushAutoloader(array('Doctrine', 'autoload'));
    spl_autoload_register(array('Doctrine', 'modelsAutoload'));

    $manager = Doctrine_Manager::getInstance();
    $manager->setAttribute(Doctrine::ATTR_AUTO_ACCESSOR_OVERRIDE, true);
    $manager->setAttribute  (
                                Doctrine::ATTR_MODEL_LOADING,
                                Doctrine::MODEL_LOADING_CONSERVATIVE
                            );
    $manager->setAttribute(Doctrine::ATTR_AUTOLOAD_TABLE_CLASSES, true);

    $dsn = $this->getOption('dsn');
    $conn = Doctrine_Manager::connection($dsn, 'doctrine');
    $conn->setAttribute(Doctrine::ATTR_USE_NATIVE_ENUM, true);
    $conn->setCollate('utf8_unicode_ci');
    $conn->setCharset('utf8');
    $conn->setAttribute(Doctrine_Core::ATTR_AUTO_FREE_QUERY_OBJECTS, true );

    Doctrine::loadModels(APPLICATION_PATH . '/models');
    return $manager;
}

Doctrineモデルは「アプリケーション/モデル」に保存されます

次に、私のapplication / configs / application.iniで:

autoloadernamespaces[] = "Doctrine"
dsn = "mysql://your_login:your_pass@server_ip/database"
于 2012-05-29T09:19:49.830 に答える
0

問題を見つけました!

すべてのx.phpDoctrine_RecordクラスにxTable.phpDoctrine_Tableクラスが関連付けられていることを確認する必要があります。そうしないと、レコードの読み込みが中断されます。

于 2012-05-30T01:30:32.803 に答える