Проблема автозагрузки моделей Zend - PullRequest
2 голосов
/ 15 мая 2011

Zend Framework. Я хочу автоматически загружать свои классы моделей из папки models , из класса bootstrap . Эти модели фактически не используют никакого пространства имен (поэтому у меня есть класс файла Ex. User.php с именем User и т. Д.).

Если я правильно понял, я должен использовать Zend_Loader_Autoloader_Resource , и я попытался:

function _initLoaderResource() 
{         
    $resourceLoader = new Zend_Loader_Autoloader_Resource(array(                 
    'basePath'  => APPLICATION_PATH,//points to the "application" path where resides "models" folder
    'namespace' =>''       
    ));         

    $resourceLoader->addResourceType('models', 'models/');

} 

И я получаю следующее сообщение «Zend_Loader_Exception»:

'Initial definition of a resource type must include a namespace' 

Мои вопросы:

  • Это правильный путь для автозагрузки моделей?
  • Как мне управлять кодом ресурса, который не соответствует стандарту кодирования Zend Framework?

Ответы [ 2 ]

5 голосов
/ 16 мая 2011

На самом деле вы, вероятно, не хотите использовать для этого автозагрузчик ресурсов, поскольку (как вы обнаружили) для него требуется пространство имен.Стандартный автозагрузчик (который загружает модели по пути включения) имеет параметр setFallbackAutoloader, который сообщает ZF, что этот автозагрузчик следует использовать для любого класса, не соответствующего пространству имен, охватываемому другим.Поэтому все, что вам нужно сделать, это убедиться, что каталог вашей модели находится в пути включения, и установить для этого параметра значение true.

Вы, вероятно, уже используете стандартный автозагрузчик для загрузки классов Zend, так что вы, вероятно, захотитеизмените файл application.ini, чтобы добавить каталог модели в путь включения, а затем установите альтернативный вариант в application.ini или в своем классе Bootstrap:

protected function _initAutoloader()
{
    $autoloader = Zend_Loader_Autoloader::getInstance();
    $autoloader->setFallbackAutoloader(true);

    return $autoloader;
}
1 голос
/ 15 мая 2011

Zend Autoloader использует пространства имен, чтобы убедиться, что вы не используете процесс автозагрузки для тех классов, которые вам не нужны.Поэтому вам нужно будет выбрать пространство имен для ваших классов.

Вы можете начать свои классы с пространства имен, специфичного для приложения, или общего.Пространства имен, такие как «My_» или «App_», являются общими, но, например, если ваше приложение называется Job Board, вы можете использовать пространства имен, такие как «JB_», в своих файлах классов.

Вы также можете написать свой собственный автозагрузчик (либо совершенно новый, либо путем расширения автозагрузчика Zend) и зарегистрируйте его как автозагрузчик SPL , чтобы обойти это.

Ваши имена классов не должны следовать соглашениям об именах Zend Framework,просто убедитесь, что у них есть пространство имен, и зарегистрируйте пространство имен в автозагрузчике.

Здесь я прилагаю часть своего кода, который регистрирует некоторые ресурсы для автозагрузки.У меня есть несколько модулей, и у каждого модуля есть пространство имен относительно имени этого модуля.Обратите внимание, что, поскольку было много пространств имен, я регистрирую их все в цикле.

    $nameSpaceToPath = array(
                            'Application'   => APPLICATION_PATH,
                            'Base'          => APPLICATION_PATH . '/base',
                            'Store'     => APPLICATION_PATH . '/modules/Store',
                            'Payment'     => APPLICATION_PATH . '/modules/Payment',
                            'Admin'     => APPLICATION_PATH . '/modules/Admin'
                        );

    foreach($nameSpaceToPath as $ns => $path) {
        $autoLoaderResource = new Zend_Loader_Autoloader_Resource(
                            array(
                                'basePath' => $path,
                                'namespace' => $ns
                            )
                        );
        $autoLoaderResource->addResourceType('controller','controllers','Controller');
        $autoLoaderResource->addResourceType('model','models','Model');
        $autoLoaderResource->addResourceType('mapper','models/mappers','Model_Mapper');
        $autoLoaderResource->addResourceType('service','services','Service');
        // I'm using _Util_ in the name of my utility classes, I place them in 'utils' directory
        $autoLoaderResource->addResourceType('util','utils','Util');
        $autoLoaderResource->addResourceType('plugin','plugins','Plugin');
        $autoLoaderResource->addResourceType('form','forms','Form');
        // I'm using _Exception_ in the name of my module specific exception classes, I place them in 'exceptions' directory
        $autoLoaderResource->addResourceType('exception','exceptions','Exception');
        $autoLoader->pushAutoloader($autoLoaderResource);
    }

Когда вы определяете тип ресурса, вызывая:

$autoLoaderResource->addResourceType('service','services','Service');

Вы на самом деле говорите ZendАвтозагрузчик, у вас есть тип 'service' (1-й параметр), который находится в каталоге с именем 'services' (2-й параметр), и вы используете маркер ' Service ' в именах классов для указания классовэтого типа.

Приведенный выше код сообщает Zend Autoloader о поиске класса Store_Service_Core по пути 'APPLICATION_PATH / modules / store / services / Core.php'.

Как видите, у меня естьзарегистрировал общее пространство имен «Приложение» для пути APPLICATION_PATH.Это означает, что каждый класс, начиная с Application_, будет автоматически загружаться из APPLICATION_PATH.Например, у меня есть класс с именем Application_Init, который использует некоторые задачи инициализации, и теперь Zend автоматически загружает его из пути APPLICATION_PATH / Init.php.

...