Используйте Zend_Autoloader для моделей
-
12-09-2019 - |
Вопрос
кто-нибудь знает, как использовать «новый» автозагрузчик Zend для загрузки моделей?На данный момент моя конфигурация выглядит так:
application.ini
# Autoloader Namespace
autoloadernamespaces.0 = "Sl_"
Bootstrap.php
/**
* Start Autoloader
*
* @access protected
* @return Zend_Application_Module_Autoloader
*/
protected function _initAutoload()
{
$autoloader = new Zend_Application_Module_Autoloader(array(
'namespace' => 'Sl_',
'basePath' => dirname(__FILE__),
));
return $autoloader;
}
Поэтому, когда я помещаю модель в /Models/User.php с помощью
class Sl_Model_User{}
и создайте новый объект, все работает как задумано.Но как я могу использовать автозагрузчик для загрузки модели, помещенной в /Models/Dao/UserDB.php?
class Dao_UserDB{}
Решение
Проверьте документацию по Resource_Autoloader (его цель — загружать ресурсы, находящиеся в каталоге моделей или где-то еще, т. е. вне папки /library).
«Автозагрузчики ресурсов предназначены для управления кодом библиотеки с пространством имен, который соответствует стандартным рекомендациям по кодированию Zend Framework, но не имеет сопоставления 1:1 между именем класса и структурой каталогов.Их основная цель — облегчить автоматическую загрузку кода ресурсов приложения, такого как модели, формы и списки управления доступом для конкретного приложения.
Автозагрузчики ресурсов регистрируются в автозагрузчике при создании экземпляра с пространством имен, с которым они связаны.Это позволяет вам легко размещать код пространства имен в определенных каталогах и при этом пользоваться преимуществами автозагрузки».
path/to/some/directory/
acls/
Site.php
forms/
Login.php
models/
User.php
$resourceLoader = new Zend_Loader_Autoloader_Resource(array(
'basePath' => 'path/to/some/directory',
'namespace' => 'My',
));
$resourceLoader->addResourceTypes(array(
'acl' => array(
'path' => 'acls/',
'namespace' => 'Acl',
),
'form' => array(
'path' => 'forms/',
'namespace' => 'Form',
),
'model' => array(
'path' => 'models/',
),
));
Попробуйте это в своем файле boostrap:
protected function _initLoaderResource()
{
$resourceLoader = new Zend_Loader_Autoloader_Resource(array(
'basePath' => 'your_doc_root' . '/application',
'namespace' => 'MyNamespace'
));
$resourceLoader->addResourceTypes(array(
'model' => array(
'namespace' => 'Model',
'path' => 'models'
)
));
}
Другие советы
В зависимости от вашей текущей настройки
КлассФайл:/Модели/Дао/UserDB.php
Имя класса:класс Dao_UserDB{}
должно быть:
$autoloader = new Zend_Application_Module_Autoloader(array(
'namespace' => 'Dao_',
'basePath' => APPLICATION_ROOT.'/Models/Dao/',
));
Но вы также можете назвать класс:S1_Dao_UserDB() должно работать без изменений.
Чтобы определить правила автозагрузчика для пользовательских моделей (в каталоге пользовательской библиотеки), например:
|-application
|-library
|-Foo
|-Models
|-Bar.php (holds Foo_Model_Bar class - mind no 's' in class name)
|-Forms
|-Bar.php (holds Foo_Form_Bar class - mind no 's' in class name)
|-Zend
|-public
|-test
Вы должны добавить это в свой Bootstrap.php.
/**
* Enable loading custom classes
*/
public function _initAutoloaders()
{
$resourceLoader = new Zend_Loader_Autoloader_Resource(array(
'basePath' => APPLICATION_PATH . '/../library/Foo',
'namespace' => 'Foo_'
));
$resourceLoader->addResourceTypes(array(
'foomodels' => array(
'namespace' => 'Model_',
'path' => 'Models')
),
'fooforms' => array(
'namespace' => 'Form_',
'path' => 'Forms')
),
);
}
Мне потребовалось некоторое время, чтобы разобраться в этом, надеюсь, это сэкономит кому-то время.