Пошаговое преобразование в модульную структуру папок для Zend-проекта - PullRequest
8 голосов
/ 12 октября 2010

Я ищу пошаговое объяснение того, как перейти от обычной структуры папок слева, где папка application содержит models,views,controllers, к модульной структуре папок справа, где application содержит папку modules, которая содержит отдельные модули со своими models,views,controllers.

Я говорю «преобразование», потому что я не думаю, что Zend позволяет нам создавать проекты с использованием архитектуры модулей с самого начала, но если бы это было так, это было бы здорово и избавило бы от необходимости вносить изменения в структуру папок.вручную.

http://img375.imageshack.us/img375/5582/foldersboth.jpg

Вот мой опыт пока

  • Когда я создаю модуль zf create module product, папка модулейгенерируется и папка product генерируется внутри него, и views,controllers,models для этого модуля также генерируется.

  • Но мне также нужно переместить основную views,controllers,models в собственную папку modules/default.Если я создаю эту папку вручную и перемещаю туда основную views,models,controllers, я получаю ошибку при попытке добавить новые контроллеры в этот модуль default.Ошибка в том, что он повторно генерирует основной (теперь отсутствует) views,controllers,models в application и вставляет этот новый контроллер в application/controllers/newcont, потому что он не распознает, что папка контроллеров по умолчанию была перемещенавручную до application/modules/default/controllers/.

  • Так что мое решение для этого было zf create module default, а затем скопируйте туда основной views,models,controllers.В конечном итоге он выглядит одинаково, но каким-то образом метод zf create module имеет значение.Когда я делаю это таким образом, новые контроллеры добавляются правильно в application/modules/default/controllers, а не application/controllers

Половина решенной проблемы.Но когда я пытаюсь просмотреть приложение, я ничего не вижу из вида index/index.Я тоже не получаю никаких ошибок, но ничего не вижу.Я подозреваю, что это потому, что приложение не знает, что представление index/index сместилось.

  • Раньше это было в application/views/scripts/index/index.phtml
  • , но теперь оно находится в application/modules/default/views/scripts/index/index.phtml

Полагаю, мне нужно внести изменения в application.ini, в bootstrap.php или в другое место.Итак, что именно нужно сделать, чтобы сделать это гладко и заставить его работать?Я использую последнюю версию ZF 1.10.8.Пожалуйста, начните с создания нового Zend-проекта, чтобы не было путаницы в точных шагах.

Ответы [ 2 ]

10 голосов
/ 13 октября 2010

Вот что я сделал, чтобы попытаться следовать вашему примеру (с нуля):

$ zf create project .
$ zf create module product
$ zf create module default

Затем я переместил controllers, models и views с ./application на ./application/modules.

Затем я открыл application.ini, и заменил эту строку (которая сообщает ZF, где искать контроллеры в немодульном приложении):

resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"

на:

resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"

, который сообщает ZF, где искать модули.

Затем я вручную создал контроллер индекса для модуля продукта, чтобы я мог проверить, работает ли он, что и сделал.Затем я нажал http://localhost/index/index, чтобы посмотреть, работает ли индексное действие модуля по умолчанию, но это не так, вместо этого я получил ошибку:

Неустранимая ошибка: необработанное исключение 'Zend_Controller_Dispatcher_Exception' с сообщением«Недопустимый класс контроллера (« Default_ErrorController »)» в ...

похоже, что это то, куда вы попали.

Есть два способа исправить эту ошибку, и документация вводит в заблуждение (возможно, даже неправильно).Он сообщает :

Обратите внимание, что в модуле по умолчанию контроллерам не требуется префикс пространства имен.Таким образом, в приведенном выше примере контроллеры в модуле по умолчанию не нуждаются в префиксе «Default_» - они просто отправляются в соответствии с именем базового контроллера: «IndexController» и «FooController».Однако префикс пространства имен используется во всех других модулях.

, но явно указанная выше ошибка указывает на то, что ZF ищет класс ErrorController с именем Default_ErrorController.Чтобы это исправить, вы можете сделать одно из двух:

  • Изменить имена классов application / modules / default / controllers / IndexController.php с IndexController на Default_IndexController и application / modules /default / controllers / ErrorController.php от ErrorController до Default_ErrorController
  • Или удалите эту строку:

    resources.frontController.params.prefixDefaultModule = "1"

из application.ini.Эта строка указывает ZF использовать пространство имен Default_ в классах модулей по умолчанию, поэтому без него он просто будет искать IndexController.Я выбрал последний вариант, и http://localhost/index/index затем работал как положено.

В вашем случае вы сказали, что получили пустую страницу в / index / index, что означает либо:

  • У вас другая проблема
  • У вас отключены ошибки в режиме разработки
  • Вы работаете в производственном режиме, где ошибки по умолчанию отключены (скорее всего)

, чтобы проверить последний вариант, откройте application.ini и временно измените phpSettings.display_errors с 0 на 1 в производственном разделе.Если после этого вы получите ту же ошибку, которая была у меня выше, надеюсь, вы сможете заставить все работать.

Надеюсь, это полезно.Все, что я могу сказать, - это не слишком полагаться на Zend_Tool для управления вашим приложением - оно не может делать все, и часто легче перемещать вещи вручную, чем пытаться делать все через.команда zf;особенно при реструктуризации.

1 голос
/ 12 октября 2010

Ну, я разработчик в Netbeans IDE.

http://i.stack.imgur.com/n9Zjn.jpg

Я новичок: P (нужно 10 баллов)

Каждый Bootstrap должен иметь:

<?php 
// Public_Bootstrap replace for Blog_Bootstrap or Administrator_Bootstrap
// well its for me
class Public_Bootstrap extends Zend_Application_Module_Bootstrap {

}

Main Bootstrap:

<?php
    class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {

       protected function _initAutoLoad() {

          $modLoader = new Zend_Application_Module_Autoloader(
                    array(
                        'namespace' => '',
                        'basePath' => APPLICATION_PATH . '/modules/public'
                    )
          );        

          return $modLoader;
       }
       public function _initViewHelpers() {

          $this->bootstrap(array('frontcontroller', 'view'));
          $view = $this->getResource('view');
          $view->doctype('XHTML1_STRICT');
          $view->headMeta()->appendHttpEquiv("Content-Type", "text/html;charset=UTF-8")
            ->appendName("description", "Some description");
     }
  }

application.ini:

[production]
resources.modules[] =
phpSettings.display_startup_errors = 0 
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php" 
bootstrap.class = "Bootstrap" 
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"

resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.frontController.defaultmodule = "public" 
resources.frontController.prefixDefaultModule = true  

resources.view[] = 

resources.db.adapter = PDO_MYSQL
resources.db.isDefaultTableAdapter = true 
resources.db.params.host ="localhost"
resources.db.params.username ="yourUser"
resources.db.params.password ="yourPassword"
resources.db.params.dbname ="DBName"

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

...