Zend Framework - модуль переопределения - PullRequest
0 голосов
/ 22 августа 2011

Я работаю над мультисайтовой CMS в Zend Framework.Я дошел до того, что мне нужно переопределить модуль из приложения / папки в папке моего сайта / приложения.Чуть лучше объяснение моей проблемы:Вот дерево моего приложения (важная часть):

library/
application/
        module1/
            controllers/
            models/
            ....
        module2/
            controllers/
            models/
            ....
websites/
  website1.com/
       application/
            module1/
                controllers/
                models/
                ....

Итак, что мне нужно сделать, это то, что module1 / на веб-сайте / website1.com / application / override module1 / в приложении, ЕСЛИ он существует.Я хочу, чтобы все в module1 / в папке вебсайтов переопределяло все в основной папке приложения.Я также хотел бы, чтобы в этом модуле было 2 контроллера (например, IndexController и TestController) и если я поместил только TestController в папку веб-сайтов в module1 / controllers, чтобы переопределить ТОЛЬКО TestController из папки Application и получить IndexController из главной папки.Извините, если мне не удалось объяснить, чего именно я пытаюсь достичь.Если что-то неясно, пожалуйста, спросите.Спасибо. Редактировать: Окей, прежде всего - спасибо за ваши комментарии.Причина наличия сайтов / папок - в основном из-за vhost, так как я предпочитаю, чтобы на всех моих сайтах были отдельные (публичные?) Папки, а причина наличия одной библиотеки с папкой приложения - в том, что, очевидно, причины обновления (поэтому, когда яНапример, обновите Zend - мне не нужно обновлять его для каждого веб-сайта).Скорее всего, я редко использую опцию переопределения для контроллеров, и да, я бы даже предпочел, если бы я мог, например, расширить основной контроллер (например, IndexController) и переопределить некоторые функции, но я подумал, что это намного сложнее, чем переопределить весьучебный класс.Вот полная структура моего приложения:

 library/ - Library folder contains Zend and many other classes that I'll use in my application.
     Zend - Zend Framework
     MyCMS - Classes from my old CMS.
 sites/ - Folder that contains websties.
     website_1 - Website one.
         application/ - Application folder for website one. If I need to redefine module or something. So, if I need to override module: main_module, I'll  create folder main_module here with files that I want to override.
         config/ - Configuration for website_1 - if I need to override, for example, application.ini
         lang/ - Language files for this specific website.
         templates/ - Templates folder for website (layouts and templates). By the way, I'm using smarty.
             default/ - Main template.
                 layout/ - Layouts for Zend View.
                 css/
                 js/
                 images/
                 modules/
         files/ - Place to upload files in, for this website. This will contain user avatars and stuff.
         index.php - Main file that runs bootstrap and application.
         Bootstrap.php - Inherited bootstrap. In case I need to override some functions from default bootstrap.
 application/ - Main folder that contains application modules and stuff.
    main_module/
         configs/ - Module configuration.
             config.ini
         controllers/ - Controllers for this module.
         modules/ - Submodules. There are like boxes that I display on website. For example, if my main module is "news", here, I'll make new sub-module to display box with statistics.
             submodule/
                 services/ - XML/JSON/whatever service. If someone targets controller in services with specific parametars, it'll return response in requested format.
                     controllers/ - Services will only have controllers.
                 configs/ - Configuration for this submodule.
                 controllers/ - Controllers for this submodule.
                 models/ - Models for this submodule.
                 lang/ - Language files for this submodule.
                 template/ - Templates for this submodule.
                     helpers/
                     css/
                     js/
                     images/
                     index.html
         models/ - Models for main module.
         lang/
         services/  - Main module will also have services. See submodule services for explanation.
             controllers/
         template/
             helpers/
             css/
             js/
             images/
             index.html
     Bootstrap.php  - This is main bootstrap file that every website's bootstrap file will extend (and override some methods - if needed).

1 Ответ

1 голос
/ 22 августа 2011

Обновление

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

Чтобы загрузить несколько контроллеров, вы должны создать плагин Front Controller длядобавить пути к стеку каталогов контроллера

class My_Controller_Plugin_Paths extends Zend_Controller_Plugin_Abstract
{
    public function preDispatch()
    {
        // Something like this...
        // Would be best to load paths via config/database or somewhere
        $dispatcher = Zend_Controller_Front::getInstance()->getDispatcher();
        $dispatcher->addControllerDirectory('/path/to/website1.com/controllers')
                   ->addControllerDirectory('/path/to/website2.com/controllers');
    }
}

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


Я согласен с @Laykes.Это плохо структурированное приложение.

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

/application
    /modules
        /default
            /controllers
                /IntexController.php      // Default_IndexController
                /Website1com
                    /IndexController.php  // Default_Website1com_IndexController (possibly extends Default_IndexController)

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

Автозагрузка чего-либо подобного, хотя полностью зависит от вас и ваших приоритетов.Вы можете сделать несколько вещей, каждая из которых имеет свои собственные + ve и -ve.

  • Вы можете бросить все пути в ваши include_path в том порядке, в котором вы хотите
  • Проверить наличие файлов изагрузить из плагина фронт-контроллера

Чтобы назвать пару.

...