学说懒惰加载

时间:2010-09-01 13:07:57

标签: php doctrine

我正在处理Doctrine,并使用建议的延迟加载模型。根据教程,我创建了一个doctrine bootstrap文件:

<?php
require_once(dirname(__FILE__) . '/libs/doctrine/lib/Doctrine.php');
spl_autoload_register(array('Doctrine', 'autoload'));
$manager = Doctrine_Manager::getInstance();
$manager->setAttribute(Doctrine_Core::ATTR_AUTO_ACCESSOR_OVERRIDE, true);
$manager->setAttribute(Doctrine_Core::ATTR_MODEL_LOADING, Doctrine_Core::MODEL_LOADING_CONSERVATIVE);
Doctrine_Core::loadModels(array(dirname(__FILE__) . '/models/generated', dirname(__FILE__) . '/models')); //this line should apparently cause the Base classes to be loaded beforehand

我的模型和基类都是由Doctrine创建的。

我还创建了一个简单的测试文件,如下所示:

<?php
require_once('doctrine_bootstrap.php');

$user = new User();
$user->email = 'test@test.com';
echo $user->email;

但是,这会产生以下错误:

Fatal error: Class 'User' not found in E:\xampp\htdocs\apnew\services\doctrine_test.php on line 4

但是,如果我明确要求BaseUser.php和User.php文件,那么它可以正常工作而没有任何错误

<?php
require_once('doctrine_bootstrap.php');
require_once('models/generated/BaseUser.php');
require_once('models/User.php');

$user = new User();
$user->email = 'test@test.com';
echo $user->email;

因此,似乎Doctine没有正确自动加载模型。我错过了什么?

3 个答案:

答案 0 :(得分:2)

好的,所以你需要bootstrap文件中的以下行:

spl_autoload_register(array('Doctrine_Core', 'modelsAutoload'));

然后自动加载按预期工作

答案 1 :(得分:2)

你的方法是正确的,因为Doctrine有自己的加载功能:

Doctrine::loadModels('models'); 
Doctrine::loadModels('models/generated'); 
Doctrine::loadModels('models/tables'); 
...

这不是递归的,因此您需要添加包含映射/托管模型的文件夹。

答案 2 :(得分:0)

在User.php模型中,需要对顶部的BaseUser.php类进行要求。用户类扩展了BaseUser.php

我遇到过这个问题并解决了这个问题。我会感兴趣的是,如果有一些我不想做的事情,包括手动。给出一个镜头,看看它是否解决了问题,而不需要User.php