[英]Loading Modules which has multiple module in Zend Framework 2
问题
所以我尝试将我的应用程序解耦到多个模块项目(每个模块都有自己的composer.json ),然后实际的应用程序将通过composer加载所有此项目。
每个模块项目都有一个可通过浏览器访问的用户界面,并且可以单独启动,因此它不仅仅是一个简单的库。 该文件将存在于每个模块项目中:
示例模块(依赖关系是我在application.config.php中的模块数组中写的内容):
现在在我的最终应用程序中,假设MyApplication需要CMSModule和AccountingModule ,但是我不能仅在application.config.php中编写这两个模块。 相反,我必须写:
我只需要在MyApplication中编写这两个
这可以做到吗? 我想这家伙想在Zend Framework 2中动态加载模块中实现什么
根据我们在评论和问题上的交流,您将至少需要3个应用程序。 我会给你一个简单的例子,您必须自己更新每个应用程序的要求。 完成composer.json配置后,我将为您提供一个骨架模块用作主题模块。
这些配置将用作root
composer.json配置文件。 每个必需的程序包都应具有针对特定程序包的自己的作曲者文件列表要求。
例如,“核心”模块将需要各种Zend Framework软件包。 “主题”包可能需要其他ZF包,例如zendframework/zend-view
才能具有GUI布局。
应用程序1的composer.json
{
"name": "COMPANY_NAME/APPLICATION_1",
"require": {
"COMPANY_NAME/MODULE_1_THEME": "*",
"COMPANY_NAME/MODULE_2_CMS": "*"
},
"repositories": [
{
"type": "git",
"url": "git@github.com/COMPANY_NAME/MODULE_1_THEME.git"
},
{
"type": "git",
"url": "git@github.com/COMPANY_NAME/MODULE_2_CMS.git"
},
]
}
应用程序2的composer.json
{
"name": "COMPANY_NAME/APPLICATION_2",
"require": {
"COMPANY_NAME/MODULE_1_THEME": "*",
"COMPANY_NAME/MODULE_3_ACCOUNTING": "*"
},
"repositories": [
{
"type": "git",
"url": "git@github.com/COMPANY_NAME/MODULE_1_THEME.git"
},
{
"type": "git",
"url": "git@github.com/COMPANY_NAME/MODULE_3_ACCOUNTING.git"
},
]
}
应用程序3的composer.json
(无主题)
{
"name": "COMPANY_NAME/APPLICATION_3",
"require": {
"COMPANY_NAME/MODULE_4_AUTH_MODULE": "*"
},
"repositories": [
{
"type": "git",
"url": "git@github.com/COMPANY_NAME/MODULE_4_AUTH_MODULE.git"
}
]
}
如您所见,应用程序1和2使用相同的MODULE_THEME
包,如问题图中的概述所示。
现在,为Zend Framework创建的程序包对于您创建的每个程序包几乎都是相同的,因此,请按照您对每个模块(程序包)的要求进行修改。
该模块基本上替代了您在安装Zend Framework(2或3)Skeleton Application时默认获得的Application
模块。
我最近将Zend Framework的所有功能升级到Zend Framework 3,所以我将为您提供针对ZF3量身定制的设置。 但是,将ZF2降级应该不是太大的问题。
一个典型的主题需要一些事情,例如:
可以在Theme模块的module.config.php
中进行此配置(但不限于!随您便!)
namespace COMPANY_NAME\Theme;
use COMPANY_NAME\Theme\Controller\ThemeController;
use COMPANY_NAME\Theme\Factory\ThemeControllerFactory;
return [
'controllers' => [
'factories' => [
ThemeController::class => ThemeControllerFactory::class,
],
],
'router' => [
'routes' => [
'home' => [
'type' => Literal::class,
'may_terminate' => true,
'options' => [
'route' => '/',
'defaults' => [
'controller' => ThemeController::class,
'action' => 'index',
],
],
],
],
],
'route_layouts' => [
'*' => 'layout/layout',
'login' => 'layout/login',
'register' => 'layout/login',
'error*' => 'error/index',
'error/404' => 'error/404',
],
'translator' => [
'locale' => 'en_US',
'translation_file_patterns' => [
[
'type' => 'gettext',
'base_dir' => __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'language',
'pattern' => '%s.mo',
],
],
],
'view_manager' => [
// controller_map is optional, but depending on your composer package nesting, could be a great help. Have a look here for how to use: https://blog.alejandrocelaya.com/2015/08/14/working-with-sub-namespaced-modules-in-zend-framework-2-the-right-way/
'controller_map' => [
'COMPANY_NAME\Theme' => 'company_name_path_alias',
],
'display_not_found_reason' => true,
'display_exceptions' => true,
'doctype' => 'HTML5',
'not_found_template' => 'error/404',
'exception_template' => 'error/index',
'template_map' => [
'layout/layout' => __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'view' . DIRECTORY_SEPARATOR .
'layout' . DIRECTORY_SEPARATOR . 'layout.phtml',
'layout/login' => __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'view' . DIRECTORY_SEPARATOR .
'layout' . DIRECTORY_SEPARATOR . 'login.phtml',
'error/404' => __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'view' . DIRECTORY_SEPARATOR .
'error' . DIRECTORY_SEPARATOR . '404.phtml',
'error/index' => __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'view' . DIRECTORY_SEPARATOR .
'error' . DIRECTORY_SEPARATOR . 'index.phtml',
],
'template_path_stack' => [
__DIR__ . DIRECTORY_SEPARATOR .'..' . DIRECTORY_SEPARATOR . 'view',
],
],
];
软件包的位置为/vendor/COMPANY_NAME/THEME_MODULE_NAME
(正如您在composer.json
文件中的name
属性中为该软件包所定义的那样)。
文件夹/文件结构为:
这些非常简单,因为Controller几乎是Skeleton Application提供的原始IndexController
的副本。 在这种情况下,工厂除了返回控制器外什么也不做。 因此,你可以与FQCN更换配置为它的InvokableFactory
Zend框架3,而不是使工厂类。 但是,如果您的ThemeController
需要某些要求(例如RegisterForm
),则将需要Factory提供这些要求。
ThemeController
namespace COMPANY_NAME\Controller;
use Zend\Mvc\Controller\AbstractActionController;
class ThemeController extends AbstractActionController
{
public function indexAction()
{
return [];
}
}
ThemeControllerFactory
namespace COMPANY_NAME\Factory;
use COMPANY_NAME\Controller\ThemeController;
use Zend\ServiceManager\Factory\FactoryInterface;
class ThemeControllerFactory implements FactoryInterface
{
/**
* @param ContainerInterface $container
* @param string $requestedName
* @param array|null $options
* @return ThemeController
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
*/
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
return new ThemeController();
}
}
显然,您的模块将没有相同的要求。 确保每个模块都弄清楚它们是什么。
对于我自己的主题模块,我的composer.json
文件中具有以下Zend Framework要求:
{
"name": "COMPANY_NAME/THEME_MODULE_NAME",
"require": {
"zendframework/zend-di": "*",
"zendframework/zend-navigation": "*",
"zendframework/zend-view": "*",
}
}
在require
部分中,我还有: "rwoverdijk/assetmanager": "^1.6",
此模块用于将所有CSS,JS(实际上是任何类型)文件混在一起到确定的位置。 我建议您( 在这里 )看看。
COMPANY_NAME
替换为您的Github帐户的用户名(如果使用Bitbucket或Gitlab,则替换为标识帐户名) THEME_MODULE_NAME
替换为存储库的名称 "rwoverdijk/assetmanager": "^1.6"
)。 版本锁定可以在将来为您节省很多麻烦... 此外:使用软件包作为“主题模块”,可以完全删除Zend Framework骨架应用程序随附的module/
文件夹。 但是,建议您将module/
文件夹用于特定于应用程序的模块。 如果为所有内容创建一个程序包,很快就会发现自己处于维护困境。
是的,您的布局就是我最后的想法
但是,建议您将module /文件夹用于特定于应用程序的模块。
有点类似,我最终为每个特定的包(zf2样式)放入一个文件夹
感谢您的澄清和答复。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.