Использование пространств имен PHP в приложении Zend Framework (v1) - PullRequest
13 голосов
/ 29 июня 2011

Возможно ли в текущей стабильной версии 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 поддерживает автозагрузку пространств имен, и он работает нормально при включении библиотек пространств имен, но мне не удалось выполнить ту же работу с классами приложений.

Ответы [ 2 ]

7 голосов
/ 29 июня 2011

На самом деле есть простой обходной путь , предложенный Дмитрием для системы отслеживания проблем 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\\');
    }
}

Работает для меня как шарм!

5 голосов
/ 05 июня 2013

Стандартный автозагрузчик, представленный в версии 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 / Model / Xyz.php

<?php
namespace Application/Model;
class Xyz {}
...