簡體   English   中英

加載在Zend Framework 2中具有多個模塊的模塊

[英]Loading Modules which has multiple module in Zend Framework 2

問題

所以我嘗試將我的應用程序解耦到多個模塊項目(每個模塊都有自己的composer.json ),然后實際的應用程序將通過composer加載所有此項目。

每個模塊項目都有一個可通過瀏覽器訪問的用戶界面,並且可以單獨啟動,因此它不僅僅是一個簡單的庫。 該文件將存在於每個模塊項目中:

  • 配置/ application.config.php
  • 公共/ index.php文件

示例模塊(依賴關系是我在application.config.php中的模塊數組中寫的內容):

  • UIModule
    • 相關性:AssetManager,UIModule
  • CMSModule
    • 依賴:UIModule,CMSModule
  • AccountingModule:
    • 依賴項:UIModule,AccountingModule

現在在我的最終應用程序中,假設MyApplication需要CMSModuleAccountingModule ,但是我不能僅在application.config.php中編寫這兩個模塊。 相反,我必須寫:

  • AssetManager->應該由UIModule加載
  • UIModule->應該由CMS /會計模塊加載
  • CMSModule
  • AccountingModule

我只需要在MyApplication中編寫這兩個

  • CMSModule
  • AccountingModule

這可以做到嗎? 我想這家伙想在Zend Framework 2中動態加載模塊中實現什么

像這樣,我添加了另一個附加模塊。 解耦模塊

根據我們在評論和問題上的交流,您將至少需要3個應用程序。 我會給你一個簡單的例子,您必須自己更新每個應用程序的要求。 完成composer.json配置后,我將為您提供一個骨架模塊用作主題模塊。

這些配置將用作root composer.json配置文件。 每個必需的程序包都應具有針對特定程序包的自己的作曲者文件列表要求。

例如,“核心”模塊將需要各種Zend Framework軟件包。 “主題”包可能需要其他ZF包,例如zendframework/zend-view才能具有GUI布局。


設置3個有重疊需求的獨立Zend Framework應用程序

應用程序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屬性中為該軟件包所定義的那樣)。

文件夾/文件結構為:

  • /供應商/ COMPANY_NAME / THEME_MODULE_NAME
    • 配置/
      • module.config.php
    • SRC /
      • 控制器/
        • ThemeController.php
      • 廠/
        • ThemeControllerFactory.php
      • Module.php
    • 視圖/
      • 錯誤/
        • index.phtml
        • 404.phtml
      • 布局/
        • index.phtml
        • login.phtml
        • register.phtml
    • composer.json

ThemeController和* Factory

這些非常簡單,因為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樣式)放入一個文件夾

  • 資料夾
    • composer.json
    • Module.php (用於php單元測試)
    • 公共(對於UI Package,我有這個)
      • 的index.php
    • 配置
      • application.config.php (顯然需要為每個軟件包編寫每個版本)
    • 測試
    • SRC
      • MODULE_NAME
        • 財富
        • SRC
          • MODULE_NAME
            • 調節器
            • 服務
            • 模型
            • {其他...}
        • 配置
        • 視圖
        • Module.php

感謝您的澄清和答復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM