Модуль автозагрузчика в Zend Framework - PullRequest
3 голосов
/ 23 июня 2011

Я разрабатывал проект с использованием Zend Framework и столкнулся со следующей проблемой.Я использую структуру папок Zend Framework MVC, сгенерированную с помощью их скрипта zf.sh.

В моей папке библиотеки есть папка библиотеки Zend, и ее классы можно нормально вызывать внутри приложения.Я создал еще одну папку в моей библиотеке для моих классов.Теперь это структура папок:

MyProject

| _application| _docs| _public| _library| _Zend| _Buyers| _Donations.php| _scripts

Я назвал свой класс Donation "Buyers_Donations" в качестве соглашения об именах платформы Zend.

Когда я попытался использовать этот класс внутри моего контроллера

$obj= new Buyers_Donation(); 

, он далошибка не может найти класс Buyers_Donation внутри контроллера.

Но когда я добавил следующую строку в мой Bootstrap, это сработало:

$loader = Zend_Loader_Autoloader::getInstance();
$loader->setFallbackAutoloader(true);
$moduleLoder = new Zend_Application_Module_Autoloader(
array(
'namespace'=>'',
'basePath'=>dirname(__FILE__)
));

Может кто-нибудь объяснить, что на самом деле произошло и для чегоавтозагрузчика модулей, хотя в моем приложении нет модулей?

Ответы [ 2 ]

5 голосов
/ 23 июня 2011

Как вы и подозревали, вам не следует использовать автозагрузчик модулей, так как вы не используете модули.Предполагая, что классы Zend * автоматически загружаются для вас, все, что вам нужно сделать, это сообщить стандартному автозагрузчику, что он также должен использоваться для классов в вашем пространстве имен 'Buyers'.Поэтому вместо фрагмента кода, который вы разместили, просто выполните:

$loader = Zend_Loader_Autoloader::getInstance();
$loader->registerNamespace('Buyers_');

, вы также можете установить это в application.ini, если хотите.

Я также предполагаю, что ваши классы находятся впапка библиотеки, а не в публичном каталоге, как предполагает ваш вопрос (это было бы плохо).

1 голос
/ 23 июня 2011

Если вы не хотите использовать функцию автоматической загрузки zend, вам придется включать файлы вручную с помощью require_once (), например:

 require_once 'Buyer/Donations.php';

Если вы хотите использовать Zend Loader с вашим собственным библиотечным кодом, который использует ваше собственное пространство имен, вы можете зарегистрировать его в автозагрузчике с помощью метода registerNamespace (). в начальной загрузке вы можете сделать это следующим образом:

protected function _initAutoload()
{

    $autoloader = Zend_Loader_Autoloader::getInstance()->
                           registerNamespace('Buyers_')
    return $autoloader;
}

Если автозагрузчик не работает, убедитесь, что вы указали путь к папке библиотеки. Он автоматически добавляется платформой zend в public / index.php:

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
realpath(APPLICATION_PATH . '/../library'),
get_include_path(),
)));
...