2

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

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

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

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

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

http://special.mysite.com/foo/ => '特殊/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 主机/memcache 和 db 等进行身份验证可能是有意义的......
  • 使用模块控制器等的treeRouteStack中的托管类型路由将每个模块路由到某个子域......

问题:

  • 他们是这种情况或类似情况的最佳实践吗?为什么?
4

1 回答 1

5

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

(1) 命名空间模块

ZF2 本身就可以做到这一点。ZF2 中的模块基本上只是 PHP 命名空间,所以一个名为的模块Foo\Bar是完全可以接受的,默认情况下模块加载器会在module/Foo/Barthen中查找它的模块类vendor/Foo/Bar

例如,如果你想创建一个模块 Anvil 并在命名空间 Acme 下,你将创建 directory module/Acme/Anvil,并在其中创建一个Module.php文件:

<?php
namespace Acme\Anvil;

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

在您的应用程序中config/application.config.php,您将添加Acme\Anvilmodules密钥:

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

(2) 动态加载模块

您可以采取的一种方法是修改站点的引导程序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();

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

于 2012-10-11T12:59:31.923 回答