Не удается загрузить действие индекса модуля для модуля Zend Framework - PullRequest
1 голос
/ 21 февраля 2012

Я пытаюсь создать модуль для интерфейса администратора, но у меня возникают проблемы с тем, чтобы он отвечал вообще - Я до сих пор сделал следующее: я изменил файл начальной загрузки моего основного приложения загрузить каталог модулей:

$modules = PROJECT_DIR . '/library/PHPLib/ZF/Modules';
define('MODULES_DIR', $modules);
$frontController->addModuleDirectory(MODULES_DIR);

Модуль содержится внутри моей внешней библиотеки PHP, которую я повторно использую для каждого проекта, на основе ZendFramework или нет. Это первый раз, когда я добавляю модуль, но ранее я использовал библиотеку для поддержки вспомогательных классов и плагинов без проблем. Структура модуля находится внутри модулей PHPLib / ZF / и выглядит следующим образом:

ModAdmin/
  controller/
    IndexController.php
  model/
  view/
    includes/
    layouts/
    scripts/
      index/
        index.phtml

Класс IndexController.php определен как «ModAdmin_IndexController», как мне было сказано в некоторых ресурсах ZF, которыми я владею. Сценарий присутствует, а макет еще не создан. Я не уверен, собираюсь ли я использовать один или нет.

Итак, когда я пытаюсь запросить индекс модуля ModAdmin в браузере, я получаю 404. URL, который я использую:

http://hostname/ModAdmin/

Я что-то упустил? Согласно некоторым книгам, таким как «ZendFramework In Action» и «ProPHP», они говорят, что это все, что требуется. Когда я прочитал, что они говорят, что это было так просто, я почти не мог удержаться от смеха - ничто в ZendFramework никогда не "так" просто - мне нравится ZF, ALOT, но это не просто. Сложность в том, что она такая гибкая и мощная.

В любом случае - есть идеи?

EDIT

Думаю, мне следует добавить, что я начал использовать ZF задолго до того, как появились классы Zend_Application или Zend_Tool - это было до того, как ZF стал мудрым и начал эмулировать MVC в стиле RoR - и в любом случае - в моем проекте этого нет, потому что пока я не начал исследовать модули, я даже не знал об их существовании. При этом у меня нет времени на то, чтобы настроить кривую обучения, связанную с ними, и я вполне доволен созданием своей начальной загрузки вручную.

На самом деле - если честно - я создал «инструмент развертывания» под названием «padmin», который представляет собой php-скрипт CLI, который выполняет многое из того, что делает Zend_Tool, и я использую его в сочетании с «phing», который похож на «муравей» для php - во всяком случае - я справился с этим, как и большинство людей.

EDIT2

Я нашел этот ресурс, который, по-видимому, предназначен для добавления модулей без использования Zend_Tool, и, несмотря на выполнение всех требований, которые он предъявляет, я все равно получаю код 404 при запросе модуля описанным способом:

http://hostname/modulename/index или http://hostname/modulename/

EDIT3

Ну, ребята, я не могу выразить, как это расстраивает. Каждый ресурс в Интернете либо ссылается на создание модулей с помощью Zend_Tool / Application, либо то, что я заканчиваю, обсуждает модули только в очень специфическом аспекте. Мне нужно что-то, что поможет мне отладить, почему стадия диспетчеризации / маршрутизации FrontController не находит модуль. Я установил каталог модулей в моей начальной загрузке. Модуль имеет контроллер и скрипт вида. Вот и все - ему не нужно ничего больше, чем это. Что еще это может потребовать? Я попытался добавить каталог контроллера модуля по отдельности (вместо того, чтобы добавить его через 'addModuleDirectory') и до сих пор не играли в кости. Существует некоторая документация, о которой я упоминал ранее:

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

Ну, ребята, я так и сделал:

    $defaultControllerDir  = PROJECT_DIR . '/application/controller';
    $modadminControllerDir = PROJECT_DIR . '/library/PHPLib/ZF/Modules/ModAdmin/controller';
$frontController->setControllerDirectory(array(
                                         'default'  => $defaultControllerDir,
                                         'modadmin' => $modadminControllerDir
                                        ));

Пока что - без кубиков. Браузер откликается на 404. Было бы неплохо, если бы у фронт-контроллера была какая-то внутренняя емкость для аудита / журналирования, которую я мог бы включить и точно наблюдать за происходящим (и я полагаю, что я мог бы сделать это, если бы я захотел покопаться в источнике и поместил несколько печатных заявлений, но это становится смешным).

Это абсолютно ошеломляет.Это случилось со мной давным-давно, когда я впервые изучал ZF - и как это задокументировано - когда что-то идет не так - очень трудно понять почему.Что ж, я снова здесь с другой проблемой - я выполнил все мыслимые инструкции (которые я обнаружил до знакомства с zend_tool), и все же ничего не работает.

Единственное, что я не сделал, это настроил структуру каталоговкак это:

modules/
  default/
    controllers/
    models/
    views/
  custom1/
    controllers/
    models/
    views/

но это полностью разрушило бы цель модуля, верно?Если я не могу сохранить свой код модульного модуля в библиотеке (то есть не в каталоге приложения, а во внешней библиотеке), то какой, черт возьми, смысл создавать этот модуль !?Мне нужно иметь возможность поместить мой код модуля в мою библиотеку: '/ library / PHPLib / ZF / Modules / ModAdmin' - что дает!

РЕДАКТИРОВАТЬ - В ответ на выбранный ответ

Довольно интересно - после изменения настроек каталога Apache на AllowOverride All, тогда я получаю ответ вашего плагина на запрос mod-admin вместо 404(array (3) {["module"] => string (9) "mod-admin" ["controller"] => string (5) "index" ["action"] => string (5) "index"}) затем, если я отключаю плагин, я получаю эту ошибку:

Неустранимая ошибка: необработанное исключение 'Zend_Controller_Dispatcher_Exception' с сообщением 'Указан неверный контроллер (индекс)' в / home / nevertap / work / nevertap /library / Zend / Controller / Dispatcher / Standard.php: 248 Трассировка стека: # 0 /home/nevertap/work/nevertap/library/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard-> dispatch (Object (Zend_Controlt_p_Reader_P)Объект (Zend_Controller_Response_Http)) # 1 /home/nevertap/work/nevertap/application/configuration/bootstrap.php(100): Zend_Controller_Front-> dispatch () # 2 / home / nevertap / work / nevertap / application / configuration / bootstrap.php (110): Bootstrap-> configureFrontController () # 3 /home/nevertap/www/nevertap/index.php(19): Bootstrap-> runApp () # 4 {main}, добавляемый в / home / nevertap/work/nevertap/library/Zend/Controller/Dispatcher/Standard.php в строке 248

, что очень странно, потому что ... / Modules / mod-admin / controller / IndexController.php существует какделает ... / Modules / mod-admin / view / scripts / index / index.phtml - не говоря уже о том, что классу IndexController присваивается соответствующий префикс «ModAdmin_IndexController»

FINAL EDIT

OK IНаконец-то все получилось - похоже, загрузив каталог модуля, он искал каталог контроллера по умолчанию, который всегда имел паттерн «контроллеры», а мой был «контроллер», поэтому вместо загрузки модуля с помощью addModuleDir я использовал другой:

$modadminControllerDir = PROJECT_DIR . '/library/PHPLib/ZF/Modules/mod-admin/controller';
$frontController->addControllerDirectory($modadminControllerDir, 'mod-admin');

Ответы [ 2 ]

0 голосов
/ 24 февраля 2012

переименуйте каталог вашего модуля в "mod-admin"

mod-admin/
  controller/
    IndexController.php
  model/
  view/
   ...

ваш класс контроллера должен оставаться ModAdmin_IndexController, и вы получаете к нему доступ http://hostname/mod-admin/

P.S. и, конечно, до сих пор делают это

$modules = PROJECT_DIR . '/library/PHPLib/ZF/Modules';
define('MODULES_DIR', $modules);
$frontController->addModuleDirectory(MODULES_DIR);

P.P.S

чтобы посмотреть, что происходит с вашим запросом, вы можете зарегистрировать плагин и переопределить метод routsHutdown для var_dump параметров, подобных этому (ваш файл Bootstrap должен выглядеть примерно так)

<?php

class TestPlugin extends Zend_Controller_Plugin_Abstract {

    public function routeShutdown(Zend_Controller_Request_Abstract $request) {
        var_dump($request->getParams());
        die();
    }

}

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { ...

    protected function _initDebugingRequest() {
       $front = Zend_Controller_Front::getInstance();
       $front->registerPlugin(new TestPlugin());
    }
...

P.P.P.S

убедитесь, что вы включили перезапись с помощью перезапись sudo a2enmod , а также в файле / etc / apache2 / sites-available / default у вас есть что-то вроде

<Directory /var/www/>
...
AllowOverride All
...
</Directory>
0 голосов
/ 21 февраля 2012

похоже, что вам все еще нужно инициализировать модули, я делаю это в application.ini с
resources.modules[] = ""
Я уверен, что вы можете перевести это в код начальной загрузки.
То, что у вас уже есть, эквивалентно
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules", если это дает подсказку.

[EDIT] В случае, если это не было упомянуто, каждый из ваших модулей должен иметь свою собственную начальную загрузку extends Zend_Application_Module_Bootstrap.

P.S. Я только недавно проработал свои методы Pro Zend Framework Techniques, обнаружил, что в нем много полезной информации, но он устарел в том, что касается текущей конфигурации, а некоторые инструменты в настоящее время используются в ZF. Роб Аллен ведет отличное учебное пособие по ZF, которое он обновляет для текущих версий на Akrabat.com , а у Падрига Брэди есть отличная бесплатная онлайн-книга, которая довольно актуальна, она не завершена на 100%, но очень хороша на том, что он покрывает, найди его на Выживи в глубине

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...