繁体   English   中英

ZF2:模块组

[英]ZF2: Groups of modules

我正在学习ZF2并计划一个应用程序。

我想要一个带有几组模块的应用程序。 每组模块最多可包含20多个模块。

我无法保证整个应用程序中任何模块的唯一名称,但是我可以保证它们在模块组中的唯一性。

理想情况下,使用托管路由器将请求路由到模块组。

例如http://admin.mysite.com/foo/ =>'Admin / Foo / Index / Index',

http://special.mysite.com/foo/ =>'Special / Foo / Index / Index'

想法#1

我希望为每个模块组使用不同的module_path,并对模块组周围的模块路径命名,以确定模块类的唯一性。 但是发送到module_autoloader的模块似乎只注意传递的所有字符串的第一部分。

例如

array('modules' => array(
 'Admin\Admin','Admin\Bob','Admin\Users'
));

这是我不理解的奇怪行为:

  • 这三个都将指向正确的模块控制器,但它们将加载Admin \\ Admin的视图(在模块列表中排在第一位),而不是它们自己的视图。
  • IE / users,加载Admin \\ Users \\ IndexController,但使用视图脚本Admin \\ Admin \\ view \\ admin \\ Index \\ index.phtml

我已经通过对templateInjecter进行了一些小的改动来解决了这个问题,但是看起来很混乱。

想法2

只需在其子目录前添加模块名称即可

namespace AdminAdmin\Controller,
class  IndexController {}

思考

  • 名称空间比类前缀更可取
  • 我们正在尝试尽可能多地自动执行此操作,而不是对每个模块使用硬编码的路由
  • 可能会使用多个应用程序,这些应用程序通过一个共同的cookie主机/内存缓存和db等共享一个模块进行身份验证。
  • 使用模块控制器的treeRouteStack内部的托管类型路由将每个模块路由到某个子域...

题:

  • 他们是这种情况还是类似情况的最佳实践,为什么?

我对您的问题的解释是,您实际上是在问两个问题:

(1)命名空间模块

ZF2本身可以做到这一点。 ZF2中的模块基本上只是PHP命名空间,因此一个名为Foo\\Bar的模块是完全可以接受的,并且默认情况下,模块加载器将在module/Foo/Bar然后在vendor/Foo/Bar查找其模块类。

例如,如果要创建模块Anvil并在名称空间Acme下创建目录module/Acme/Anvil ,然后在其中创建Module.php文件:

<?php
namespace Acme\Anvil;

class Module
{
    /* module class code goes here */
}

在应用程序的config/application.config.php您可以将Acme\\Anvil添加到modules键中:

return array(
    'modules' => array(
        'Application',
        'Acme\Anvil',
    ),
    // Remaining bits of config array are unchanged
);

(2)动态加载模块

您可以采取的一种方法是修改站点的bootstrap index.php以根据主机名即时修改配置。 例如,使用ZendSkeletonApplication,您可以像下面这样设置application.config.php文件:

<?php
return array(
    'modules' => array(
        'Application',
        // Other modules common to all sites go here
    ),
    'sites' => array(
        'site-one.mydomain.com' => array(
            'modules' => array(
                'ModuleOne',
                'ModuleTwo',
            ),
        ),
        'site-two.mydomain.com' => array(
            'modules' => array(
                'ModuleThree',
            ),
        ),
    ),
    // Remaining bits of config array are unchanged
);

为了完成这项工作,我们对public/index.php进行了一些修改,以拦截从config/application.config.php加载的配置数组,并重新配置modules键:

// Pick host out of request
$hostname = $_SERVER['HTTP_HOST'];

// Load application configuration
$applicationConfig = require 'config/application.config.php';

// Merge site-specific modules into loaded modules array
$applicationConfig['modules'] = array_merge(
    $applicationConfig['modules'],
    $applicationConfig['sites'][$hostname]['modules']
);

// Run the application!
Zend\Mvc\Application::init($applicationConfig)->run();

这种方法提供了一种简便的方法来更改为特定主机名加载的模块,但可以轻松扩展以允许特定于站点的配置文件自动加载以及特定于站点的模块目录。

暂无
暂无

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

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