вопросы
Поэтому я пытаюсь разделить свое приложение на несколько модулей проекта (каждый имеет свой composer.json ), то реальное приложение загрузит весь этот проект через composer
Каждый из этих проектов модуля будет иметь пользовательский интерфейс, доступный через браузер, и может запускаться индивидуально, так что это не просто библиотека. Этот файл будет существовать в каждом проекте модуля:
Пример модуля (зависимость — это то, что я пишу в массиве модулей в application.config.php):
Теперь в моем последнем приложении скажем Мое заявление это нужно как CMSModule а также AccountingModule, но я не могу написать только эти два модуля в application.config.php. Вместо этого я должен написать:
Мне нужно только написать это два в Мое заявление
Это можно сделать? что я думаю, чего этот парень хочет достичь в Динамическая загрузка модулей в Zend Framework 2
Исходя из нашего обмена комментариями и вопросом, вам понадобится как минимум 3 заявки. Я приведу краткие примеры, вам придется обновлять свои требования для каждого приложения самостоятельно. После конфигов composer.json я дам вам скелетный модуль для использования в качестве модуля темы.
Эти конфиги должны использоваться как root
Конфигурационные файлы composer.json. Каждый из необходимых пакетов должен иметь свои собственные требования к списку файлов компоновщика для конкретного пакета.
Например, для «основного» модуля потребуются различные пакеты Zend Framework. Для пакета «theme» могут потребоваться другие пакеты ZF, такие как zendframework/zend-view
для того, чтобы иметь возможность иметь макет GUI.
composer.json
для приложения 1
{
"name": "COMPANY_NAME/APPLICATION_1",
"require": {
"COMPANY_NAME/MODULE_1_THEME": "*",
"COMPANY_NAME/MODULE_2_CMS": "*"},
"repositories": [
{
"type": "git",
"url": "[email protected]/COMPANY_NAME/MODULE_1_THEME.git"},
{
"type": "git",
"url": "[email protected]/COMPANY_NAME/MODULE_2_CMS.git"},
]
}
composer.json
для приложения 2
{
"name": "COMPANY_NAME/APPLICATION_2",
"require": {
"COMPANY_NAME/MODULE_1_THEME": "*",
"COMPANY_NAME/MODULE_3_ACCOUNTING": "*"},
"repositories": [
{
"type": "git",
"url": "[email protected]/COMPANY_NAME/MODULE_1_THEME.git"},
{
"type": "git",
"url": "[email protected]/COMPANY_NAME/MODULE_3_ACCOUNTING.git"},
]
}
composer.json
для приложения 3 (не имеет темы)
{
"name": "COMPANY_NAME/APPLICATION_3",
"require": {
"COMPANY_NAME/MODULE_4_AUTH_MODULE": "*"},
"repositories": [
{
"type": "git",
"url": "[email protected]/COMPANY_NAME/MODULE_4_AUTH_MODULE.git"}
]
}
Как видите, Приложения 1 & 2 использовать то же самое MODULE_THEME
пакет, как вы указали на диаграмме в вашем вопросе.
Теперь создание пакета для Zend Framework практически одинаково для каждого создаваемого вами пакета, поэтому измените то, что соответствует требованиям, предъявляемым к каждому модулю (в пакете).
Этот модуль в основном заменяет Application
модуль, который вы получаете по умолчанию при установке скелетного приложения Zend Framework (2 или 3).
Я недавно обновил все, что у меня есть, с Zend Framework до Zend Framework 3, так что я дам вам установку, адаптированную для ZF3. Тем не менее, снижение рейтинга ZF2 не должно быть слишком большой проблемой.
Типичная тема требует нескольких вещей, таких как:
Конфиг для этого может быть (не ограничиваясь! Делай с ним что хочешь!) Как таковой в 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
(как вы бы определили в name
недвижимость в composer.json
файл для этого пакета.
Структура папок / файлов будет такой:
Это очень просто, так как контроллер в значительной степени является клоном оригинала. IndexController
предоставлено приложением Skeleton. Фабрика в этом случае ничего не делает, кроме как возвращает контроллер. Таким образом, вы можете заменить конфиг для него с FQCN на InvokableFactory
Zend Framework 3 и не делают класс Factory. Однако, если ваш ThemeController
нужны некоторые требования (такие как RegisterForm
), вам понадобится Фабрика, чтобы обеспечить их.
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();
}
}
Очевидно, что ваши модули не будут иметь такие же требования. Убедитесь, что вы выясните, какие они есть, для каждого модуля.
Для моего собственного модуля Темы у меня есть следующие требования Zend Framework в моем composer.json
файл:
{
"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"
). Блокировка версий может избавить вас от хлопот в будущем …Дополнительно: использование пакета в качестве «Тематического модуля» позволяет полностью удалить module/
папка, изначально поставляемая со скелетным приложением Zend Framework. Тем не менее, вам рекомендуется использовать module/
папка для специальных приложений модулей. Если вы создадите пакет для всего, вы скоро окажетесь в аду обслуживания.
Да, ваш макет-это то, что я пришел в конце
Тем не менее, вам рекомендуется использовать модуль / папку для специальных модулей приложения.
Вроде, в итоге я помещаю в папку для каждого конкретного пакета (стиль zf2)
Спасибо за ваше разъяснение и ответ.