Zend:自动加载Doctrine_Table和Doctrine_Record

时间:2012-05-29 07:59:51

标签: php zend-framework orm doctrine autoload

我一直在使用Doctrine_Record课程,这些课程可以自动加载一段时间;但经过一些阅读后,我决定实施Doctrine_Records和Custom Table Classes。

所以我把它添加到我的bootstrap

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

这使得Custom表类工作得很好......但它打破了自动加载记录!

如何同时进行自动加载?

即。 new User.php获取我的User Doctrine_Record类,Doctrine_Core :: getTable('User')获取我的Custom 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;

我的大部分申请目前都在解决这个问题,并且不会在这方面发生变化。

但是,我想 ALSO 使用Custom Tables

class UserTable extends Doctrine_Table {}

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

但是,只要我启用此(自定义表类)功能,就可以使用Table后缀调用Doctrine_Table类。我之前扩展并直接调用的任何Doctrine_Record类都停止工作了!我想利用两者!

2 个答案:

答案 0 :(得分:0)

我真的不明白你的自定义类的问题,但无论如何这里是我在ZF中使用mysql和UTF-8的Doctrine 1.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 / models”

然后在我的application / configs / application.ini中:

autoloadernamespaces[] = "Doctrine"
dsn = "mysql://your_login:your_pass@server_ip/database"

答案 1 :(得分:0)

我发现了问题!

你必须确保每个 x.php Doctrine_Record类都有一个关联的xTable.php Doctrine_Table类,否则记录加载会中断!