Судя по нашему обмену комментариями и вопросу, вам понадобится как минимум 3 приложения. Я приведу вам краткие примеры, вам придется обновлять свои требования для каждого приложения самостоятельно. После конфигов composer.json я дам вам каркасный модуль для использования в качестве модуля темы.
Эти конфигурации должны использоваться в качестве файлов конфигурации root
composer.json. Каждый из требуемых пакетов должен иметь свои собственные требования к листингу файлов композитора для конкретного пакета.
Например, для «основного» модуля потребуются различные пакеты Zend Framework. Для пакета «тема» могут потребоваться другие пакеты ZF, такие как zendframework/zend-view
, чтобы иметь возможность иметь макет графического интерфейса.
Настройка 3 отдельных приложений Zend Framework с перекрывающимися требованиями
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
модуля Theme
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
для этого пакета.
Структура папок/файлов будет следующей:
- /vendor/COMPANY_NAME/THEME_MODULE_NAME
- config/
- src/
- Controller/
- Factory/
- ThemeControllerFactory.php
- Модуль.php
- view/
- error/
- layout/
- index.phtml
- логин.phtml
- регистрация.phtml
- композитор.json
ThemeController и *Фабрика
Это очень просто, так как Контроллер в значительной степени является клоном оригинального IndexController
, предоставляемого приложением Skeleton. Фабрика в этом случае ничего не делает, кроме как возвращает Контроллер. Таким образом, вы можете заменить его конфигурацию на FQCN на InvokableFactory
Zend Framework 3 и не создавать класс Factory. Однако, если вашему ThemeController
нужны какие-то требования (например, RegisterForm
), вам понадобится Фабрика, чтобы предоставить их.
Контроллер темы
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();
}
}
Требования к композитору темы
Очевидно, что ваши модули не будут иметь одинаковых требований. Убедитесь, что вы выяснили, что они из себя представляют, для каждого модуля.
Для моего собственного модуля Theme у меня есть следующие требования 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/
, изначально поставляемую с приложением Skeleton Zend Framework. Тем не менее, вам рекомендуется использовать папку module/
для конкретных модулей приложения. Если вы создадите пакет для всего, вы скоро окажетесь в аду обслуживания.
person
rkeet
schedule
16.03.2018