#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.
На мой взгляд, у вас есть два возможных решения:
- настройте Zend_Autoloader, Zend_Controller и Zend_Dispatcher. Вы можете найти возможные настройки здесь, здесь и здесь .
- измените структуру каталогов.
В этом втором случае рассмотрим эти возможные проектные варианты:
- создайте независимые автономные проекты zend Framework для всех сайтов и создайте в них псевдонимы папок CMS
- как и в предыдущем, но настраивает расположение модулей с помощью: http://framework.zend.com/manual/en/zend.controller.modular.html#zend.controller.modular.directories
- Используйте CMS как библиотеку: вы помещаете все файлы cms в папку вне
/websiteN
, а затем в приложение websiteN.установленный вами iniincludePaths.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, вы можете использовать пространства имен.