Zend Framework расширяет контроллер модуля

#php #zend-framework

#php #zend-framework

Вопрос:

Структура моего сайта в настоящее время выглядит следующим образом:

 /cms/
   /data/ - caches etc
   /modules/
   /public/ - aliases from site public folders
/website1
    /images
    /layouts, views, scripts, css etc
    (no index.php because of the alias)
  

Это работает нормально, моя система ищет папку псевдонимов для запуска приложения. Однако теперь я дошел до того, что хотел бы расширить один из контроллеров модуля.

В идеале моя структура была бы:

 /cms/
   .. as above
   /CLIENT_ID/
       /modules
           ..extending/overriding scripts 
  

Однако это проблема: вызываемый контроллер должен вызываться в соответствии со структурой имен файлов Zend (Module_IndexController и т. Д.), Поэтому для расширения базовых классов было бы:

 Module_IndexController extends Module_IndexController 
  

Что, очевидно, не будет работать хорошо. Я думаю, что это должно быть:

 CLIENTID_Module_IndexController extends Module_IndexController 
  

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

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

Есть идеи? Я открыт для реструктуризации папок, но, очевидно, необходимо хранить медиафайлы в общей папке.

Ответ №1:

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

На мой взгляд, у вас есть два возможных решения:

  1. настройте Zend_Autoloader, Zend_Controller и Zend_Dispatcher. Вы можете найти возможные настройки здесь, здесь и здесь .
  2. измените структуру каталогов.

В этом втором случае рассмотрим эти возможные проектные варианты:

  • создайте независимые автономные проекты zend Framework для всех сайтов и создайте в них псевдонимы папок CMS
  • как и в предыдущем, но настраивает расположение модулей с помощью: http://framework.zend.com/manual/en/zend.controller.modular.html#zend.controller.modular.directories
  • Используйте CMS как библиотеку: вы помещаете все файлы cms в папку вне /websiteN , а затем в приложение websiteN.установленный вами ini includePaths.library = /path/to/cms/folder" . В этой возможности есть много возможных проблем, которые необходимо оценить, зная ваш проект. Таким образом, вы можете вызывать модели, расширять классы веб-сайтов для расширения cms, но вы не можете использовать свою cms в качестве точки входа и менеджера пользовательских взаимодействий на разных уровнях.

Ответ №2:

Как вы сказали, вы можете указать Zend каталог базового контроллера для каждого модуля.

 $controller = Zend_controller_Front::getInstance();
$controller->setControllerDirectory(
     array("module_name" => "directory_path")
);
  

Я бы подумал, что Zend хотел бы, чтобы соглашение об именовании было ClientId_Module_Controller . Но, если вы действительно застряли в соглашении об именах и используете php 5.3, вы можете использовать пространства имен.