Использование пространств имен PHP в приложении Zend Framework (v1)
Возможно ли в текущей стабильной версии Zend Framework (1.11) работать с классами приложений, использующими пространства имен PHP?
Application\Form\Abc instead of Application_Form_Abc
Application\Model\Xyz instead of Application_Model_Xyz
etc.
Начиная с v1.10, ZF поддерживает автозагрузку пространств имен, и работает нормально, когда используются библиотеки с пространством имен, но мне не удалось выполнить ту же работу с классами приложения.
3 ответа
На самом деле Дмитрий предлагает простой обходной путь для отслеживания проблем ZF:
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
protected function _initAutoloader()
{
$loader = function($className) {
$className = str_replace('\\', '_', $className);
Zend_Loader_Autoloader::autoload($className);
};
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->pushAutoloader($loader, 'Application\\');
}
}
Работает как шарм для меня!
Стандартный автозагрузчик, введенный в 1.12, позволяет вам использовать пространства имен с минимальными усилиями:
require 'Zend/Loader/AutoloaderFactory.php';
Zend_Loader_AutoloaderFactory::factory([
'Zend_Loader_StandardAutoloader' => [
'autoregister_zf' => true,
'namespaces' => [
'Application' => '/path/to/Application/src',
]
]
]);
Теперь вы можете использовать Application\Form\Abc
вместо Application_Form_Abc
& Application\Model\Xyz
вместо Application_Model_Xyz
и т.п.
Примеры структуры каталогов / файлов:
путь / к /Application/ SRC / Форма /Abc.php
<?php
namespace Application/Form;
class Abc {}
путь / к /Application/ SRC / Модель /Xyz.php
<?php
namespace Application/Model;
class Xyz {}
Для тех, кто хочет, чтобы ваши контроллеры работали, а не только формы и модели :) Взгляните на Zend\Controller\Dispatcher\Standard.php:174
public function formatClassName($moduleName, $className)
Вам также нужно будет поменять местами _ на «\», чтобы получить правильное имя класса.