ZF2: Groups of modules



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

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

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

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

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

http://special.mysite.com/foo/=>"特殊/Foo/指数/指数">

创意#1

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

例如

array('modules' => array(
'AdminAdmin','AdminBob','AdminUsers'
));

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

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

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

创意#2

只需将模块名称前缀到其子目录中,例如

namespace AdminAdminController,
class  IndexController {}

想法

  • 命名空间将优先于类前缀
  • 我们正在尝试尽可能多地实现自动化,而不是为每个模块使用硬编码的路由
  • 使用多个应用程序共享一个模块,通过一个通用的cookie主机/memcache和db等进行身份验证是有意义的
  • 使用模块控制器等的树RouteStack内的托管类型路由将每个模块路由到特定子域

问题:

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

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

(1) 名称间距模块

ZF2本身就可以实现这一点。ZF2中的模块基本上只是PHP命名空间,因此名为FooBar的模块是完全可以接受的,默认情况下,模块加载程序将在module/Foo/Bar中查找其模块类,然后在vendor/Foo/Bar中查找。

例如,如果您想创建一个模块Anvil,并且在名称空间Acme下,您可以创建目录module/Acme/Anvil,并在其中创建一个Module.php文件:

<?php
namespace AcmeAnvil;
class Module
{
/* module class code goes here */
}

在应用程序的config/application.config.php中,您可以将AcmeAnvil添加到modules密钥中:

return array(
'modules' => array(
'Application',
'AcmeAnvil',
),
// 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!
ZendMvcApplication::init($applicationConfig)->run();

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

相关内容

  • 没有找到相关文章