简体   繁体   English

Zend Framework-覆盖模块

[英]Zend Framework - Override module


I'm working on multi-website CMS in Zend Framework. 我正在使用Zend Framework中的多网站CMS。
I've came to a point where I need to override module from application/ folder in my website/application folder. 我已经到了需要从我的网站/应用程序文件夹中的应用程序/文件夹覆盖模块的地步。
A bit better explanation of my issue: 关于我的问题的更好解释:
Here's tree of my application (important part): 这是我的应用程序的树(重要部分):

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

So what I need to do is that module1/ in websites/website1.com/application/ override module1/ in application, IF it exists. 因此,我需要做的是在website / website1.com / application /中的module1 /在应用程序中覆盖module1 /(如果存在)。 I want everything in module1/ in websites folder to override everything in main application folder. 我希望网站文件夹中module1 /中的所有内容都覆盖主应用程序文件夹中的所有内容。
I'd also like if there are 2 controllers in this module1 (for example IndexController and TestController) and if I put only TestController in websites folder under module1/controllers to override ONLY TestController from Application folder and to get IndexController from main folder. 我也想在这个module1中是否有2个控制器(例如IndexController和TestController),并且如果我仅将TestController放在modules1 / controllers下的website文件夹中,以仅从Application文件夹覆盖TestController并从主文件夹获取IndexController。
Sorry if I failed to explain exactly what I'm trying to achieve. 抱歉,如果我无法确切说明我要实现的目标。 If there's something unclear, please ask. 如果有不清楚的地方,请询问。
Thank you. 谢谢。

Edit: Okey, first of all - thanks for your comments. 编辑: Okey,首先-感谢您的评论。
Reason for having websites/ folder is, mostly because of vhost as I prefer that all of my websites have separate (public?) folders, and reason for having one library with application folder is because, obviously, upgrade reasons (so when I, for example, upgrade Zend - I don't need to upgrade it for every website). 拥有网站/文件夹的原因主要是因为虚拟主机,因为我更喜欢我的所有网站都具有单独的(公用?)文件夹,而拥有一个带有应用程序文件夹的库的原因显然是因为升级原因(所以当我例如,升级Zend-我不需要为每个网站都进行升级)。
I'll most likely rarely use overriding option for controllers, and yes, I'd even prefer if I could, for example, extend main Controller (for example - IndexController) and override some functions, but I thought that's way harder then override whole class. 我极有可能很少对控制器使用重写选项,是的,我甚至更愿意例如扩展主控制器(例如-IndexController)并重写某些功能,但我认为再覆盖整个函数会更难类。
Here's full structure of my application: 这是我的应用程序的完整结构:

 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).

Update 更新资料

Even though I highly discourage your directory structure, it's your application and you should structure it however you like. 即使我强烈建议您不要使用目录结构,但它是您的应用程序,您应该按自己的喜好来构建它。

To load multiple controllers, you should create a Front Controller Plugin to add paths to the controller directories stack 要加载多个控制器,您应该创建一个前端控制器插件以将路径添加到控制器目录堆栈中

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');
    }
}

This is entirely untested, but you get the idea. 这是完全未经测试的,但是您知道了。 Just make sure you register the plugin with the Front Controller in you bootstrap 只要确保您在引导程序中使用Front Controller注册了插件


I'd agree with @Laykes. 我会同意@Laykes。 This is a badly structured application. 这是一个结构不良的应用程序。

I'm not sure of your exact requirements, but if it were my application, I would try to structure it like this: 我不确定您的确切要求,但是如果这是我的应用程序,我将尝试像这样进行结构化:

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

Here you can see a properly structured class inheritance without creating totally separate, and probably duplicate, application folder. 在这里,您可以看到结构正确的类继承,而无需创建完全独立的,可能重复的应用程序文件夹。

Autoloading anything like this though totally depends on you and your priorities. 自动加载此类内容完全取决于您和您的优先级。 You could do a number of things, each with their own +ve's and -ve's. 您可以做很多事情,每件事情都有自己的+ ve和-ve。

  • You could throw all paths into your include_paths in the order you want 您可以按所需顺序将所有路径放入include_paths中
  • Check files exist and load from a front controller plugin 检查文件是否存在并从前端控制器插件加载

To name a couple. 仅举几例。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM