Zend Framework 1.11 + Интеграция с Doctrine 2: автозагрузка моделей models / user.php -> Model \ User - PullRequest
0 голосов
/ 17 декабря 2010

Как я могу настроить автозагрузку так, чтобы у меня была моя структура каталогов, такая как

/application
    /models  <<--- plural
    ...

И иметь загрузчик Zend / Doctrine Autoloader Application\Model\User.Обратите внимание на модель единственного числа.

В настоящее время у меня есть настройка автозагрузчика следующим образом (в Bootstrap.php _initDoctrine())

$zendAutoloader = Zend_Loader_Autoloader::getInstance();

// Symfony
$autoloader = array(new ClassLoader('Symfony'), 'loadClass');
$zendAutoloader->pushAutoloader($autoloader, 'Symfony\\');

// Doctrine 
$autoloader = array(new ClassLoader('Doctrine'), 'loadClass');
$zendAutoloader->pushAutoloader($autoloader, 'Doctrine\\');

// Models
$autoloader = array(new ClassLoader('Application\\Model', realpath(__DIR__ . '/models')), 'loadClass');
$zendAutoloader->pushAutoloader($autoloader, 'Application\\Model');

// Proxies
$autoloader = array(new ClassLoader('Application\\Model\\Proxy', realpath(__DIR__ . '/models/proxies')), 'loadClass');
$zendAutoloader->pushAutoloader($autoloader, 'Application\\Model\\Proxy');

В настоящее время, когда я пытаюсь использовать Application\Model\User, я получаю

require(D:\Projects\Tickle\application\models\Application\Model\User.php): failed to open stream: No such file or directory

Попытка включить application\models\Application\Model\User.php.хм его страннее, чем я ожидал.Как я могу это исправить в любом случае?

Ответы [ 2 ]

2 голосов
/ 17 декабря 2010

Попробуйте:

$modelsClassLoader = new ClassLoader('Application\Model', __DIR__ . '/models');
$modelsClassLoader->register();
0 голосов
/ 17 декабря 2010

Я решил это, используя автозагрузчик Doctrine / ClassLoader вместо Zend's

.
// disable Zend Autoloader
spl_autoload_unregister(array('Zend_Loader_Autoloader','autoload'));

// use Doctrine2's Class Loader
$autoloader = new ClassLoader('Zend');
$autoloader->setNamespaceSeparator('_');
$autoloader->register();

// Symfony
$autoloader = new ClassLoader('Symfony');
$autoloader->register();

// Doctrine 
$autoloader = new ClassLoader('Doctrine');
$autoloader->register();

// Application
$autoloader = new ClassLoader('Application', realpath(__DIR__ . '/..'));
$autoloader->register();

1 из моих ошибок заключалась в том, что я должен использовать realpath(__DIR__ . '/..'), что с моей структурой каталогов, ...

/Tickle (Project name)
    /application
        /models
            /proxies
...

Указывает на «Tickle», поэтому, когда доктрина добавляет путь «Application / Models / User.php», он будет выглядеть как «/Tickle/Application/Models/Users.php», который существует

...