Zend Framework - Расширение модуля контроллера - PullRequest
4 голосов
/ 27 мая 2010

У меня следующая структура каталогов:

modules/
  api/
    controllers/
      ApiController.php
      InventoryController.php
      OtherController.php

Метод init () распространен среди нескольких контроллеров, поэтому я хочу преобразовать его в родительский класс контроллеров, например:

class Api_ApiController extends Zend_Controller_Action
{
    public function init()
    {
        // common code
    }
}

Когда я пытаюсь:

class Api_InventoryController extends Api_ApiController

Я получаю:

Неустранимая ошибка: класс 'Api_ApiController' не найден в /application/modules/api/controllers/InventoryController.php по линии 4

Почему Zend Framework не отображает Api_ApiController на модули / api / controllers / ApiController.php?

Я нашел способ обойти это, поместив ApiController в библиотеку / и зарегистрировав пространство имен, но мне это кажется взломом.

Ответы [ 2 ]

7 голосов
/ 27 мая 2010

«Проблема» в том, что ZF не регистрирует каталог контроллеров в автозагрузчике, поскольку контроллеры обычно загружаются через Zend_Controller_Dispatcher. Zend_Application_Module_Autoloader, который создается в загрузчике, с другой стороны, регистрирует только

        'dbtable' => array(
            'namespace' => 'Model_DbTable',
            'path'      => 'models/DbTable',
        ),
        'mappers' => array(
            'namespace' => 'Model_Mapper',
            'path'      => 'models/mappers',
        ),
        'form'    => array(
            'namespace' => 'Form',
            'path'      => 'forms',
        ),
        'model'   => array(
            'namespace' => 'Model',
            'path'      => 'models',
        ),
        'plugin'  => array(
            'namespace' => 'Plugin',
            'path'      => 'plugins',
        ),
        'service' => array(
            'namespace' => 'Service',
            'path'      => 'services',
        ),
        'viewhelper' => array(
            'namespace' => 'View_Helper',
            'path'      => 'views/helpers',
        ),
        'viewfilter' => array(
            'namespace' => 'View_Filter',
            'path'      => 'views/filters',
        )

Таким образом, либо вы включаете скрипт базового контроллера с помощью require_once, либо модифицируете свой автозагрузчик, добавляя также каталоги контроллеров.

0 голосов
/ 27 мая 2010

[Сильно отредактировано. Пожалуйста, игнорируйте мой предыдущий ответ; Я неправильно понял вопрос. Беспечность с моей стороны.]

Вы создали экземпляр автозагрузчика в Bootstrap? Что-то вроде:

protected function _initAutoloader()
{
    $autoloader = new Zend_Application_Module_Autoloader(array(
        'namespace' => '',
        'basePath'  => APPLICATION_PATH . '/modules',
    ));
    return $autoloader;
}
...