Модули

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Аватара пользователя
Faenir
Сообщения: 292
Зарегистрирован: 2010.01.06, 01:46
Откуда: Симферополь

Модули

Сообщение Faenir »

Доброго времени суток!

Подскажите пожалуйста, как в Yii 2 реализовать такое:
  • Нужно построить полностью модульную систему, чтобы можно было взять директорию модуля и использовать в другом проекте
  • У модуля должны быть отдельные контроллеры для фронтенда и бекенда (что то вроде этого: https://github.com/yupe/yupe/tree/maste ... ontrollers) - т.е. отдельно админка, отдельно фронтенд + общие модели.
  • Так же у модуля должен быть свой конфиг (например с роутами для фронтенда), зависимости и т.п. - примерно, как это реализовано в yupe.
  • При этом хотелось бы использовать Advanced структуру приложения (https://github.com/yiisoft/yii2/tree/ma ... s/advanced), т.к. проект большой.
В данный момент начал делать проект на Yupe (https://github.com/yupe/yupe), но хочу перевести на Yii 2, т.к. проект месяца на 3.. и думаю к этому времени уже выйдет stable версия Yii 2)

Пока не придумал ничего, кроме как делать три модуля с одним названием в /frontend/modules, /backend/modules и /common/modules... Пока только в теории. Это нормальный вариант, или можно сделать как-то правильнее/удобнее?
Аватара пользователя
vova07
Сообщения: 1004
Зарегистрирован: 2012.11.29, 14:52
Откуда: Chisinau, Moldova

Re: Модули

Сообщение vova07 »

Можете посмотреть пример тут: https://github.com/vova07/yii2-users-module . Если посмотрите структуру перед последним комитом (до рефакторинга), то можете подсмотреть хорошую структуру для advanced приложения, на данный момент, то что есть универсальное и подходит под любую структуру. (Данный подход позволяет легко устанавливать модули в новых приложениях)
Если делать все по отдельности не хочется и нужна конкретная система, то вот такой вариант https://github.com/vova07/yii2-start можете попробовать, для конкретных проектов очень удобно поддерживать.
Аватара пользователя
Faenir
Сообщения: 292
Зарегистрирован: 2010.01.06, 01:46
Откуда: Симферополь

Re: Модули

Сообщение Faenir »

vova07
Ваш модуль смотрел, еще до того, как создал тему тут) Для advanced приложения она, на сколько я понял, не подходит :(
yii2-start - буду пробовать, спасибо!

В yii2-start вроде как используется метод, который я описал в первом сообщении (три модуля с одинаковым названием в frontend/backend/common). Значит этот способ имеет право на жизнь? Или могут быть какие-то подводные камни?)
Аватара пользователя
vova07
Сообщения: 1004
Зарегистрирован: 2012.11.29, 14:52
Откуда: Chisinau, Moldova

Re: Модули

Сообщение vova07 »

Как раз для адвансэд приложения и писал данный модуль: https://github.com/vova07/yii2-users-mo ... f173d58b85 Конкретнее для yii2-start. Ссылка введет на структуру которая была реализована под мое приложение, но так как меня попросили сделать модуль универсальным (для любой структуры) то я сделал рефакторинг, и щас у него другая логика.

Касательно права на жизнь - то конечно ответ да. Сами разработчики фреймворка такой подход одобряют, и по своему опыту могу сказать что камней нету, только плюсы. Минус может быть только один, лень перебирать папки одного модуля. Но исходя из того что на такой структуре пишутся сложные приложения, то такая логика как никак подходит.
Аватара пользователя
Faenir
Сообщения: 292
Зарегистрирован: 2010.01.06, 01:46
Откуда: Симферополь

Re: Модули

Сообщение Faenir »

vova07, спасибо! Значит буду использовать такую структуру.
Сами разработчики фреймворка такой подход одобряют
Одобряют структуру advanced, или способ создания модуля из трех частей?
Про advanced читал давно уже, еще в первой версии помню рекомендовали, а вот про организацию модульности в подобной структуре,- не встречал материалы.
Аватара пользователя
vova07
Сообщения: 1004
Зарегистрирован: 2012.11.29, 14:52
Откуда: Chisinau, Moldova

Re: Модули

Сообщение vova07 »

Модули из трех частей это правильная логика при использовании advanced структуры. В этом и заключается её суть. Модульная логика ничем не отличается от обычной логики контроллеров и моделей.
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: Модули

Сообщение maleks »

По идее если модуль должен быть "переносимым", то его надо в vendor-е размещать.
А в конечных приложениях (frontend или backend) уже подключить с нужным флагом.
Те же контроллеры бэкэнда можно в подпапку admin запихнуть и в $module->beforeAction() (или подобными методами) закрыть доступ к таким контроллерам из frontend-a.

Можно даже в index.php флаг завести - frontend или backend и один раз подключать модуль в common.

Сам в раздумиях над лучшей структурой модульности, которая будет работать и на типа basic шаблоне и на таких шаблонах как advanced.
Аватара пользователя
vova07
Сообщения: 1004
Зарегистрирован: 2012.11.29, 14:52
Откуда: Chisinau, Moldova

Re: Модули

Сообщение vova07 »

maleks писал(а):Сам в раздумиях над лучшей структурой модульности, которая будет работать и на типа basic шаблоне и на таких шаблонах как advanced.
Давно уже задавался этим вопросом, и после очередных тестов пришли к такому выводу:
Для advanced приложения идеальная структура модуля будет примерно такой:

Код: Выделить всё

- module
-- controllers
--- backend
---- DefaultController.php
--- frontend
---- DefaultController.php

--models
--- backend
---- BackendModel.php
--- frontend
---- FrontendModel.php
--- DomainModel.php

-- views
--- backend
---- default
----- index.php
--- frontend
---- default
----- index.php

-- messages
--- en
---- module.php
--- ru
---- module.php

-- Module.php
-- composer.json
Для универсальной структуры basic и advanced нужно делать простую структуру модуля (хотя вариант что выше тоже подходит, только ссылки в этом случае будут иметь такой вид: /module/backend/default/action/)

Код: Выделить всё

- module
-- controllers
--- DefaultController.php
--- AdminController.php

-- models
--- DomainModels.php
--- AdminModels.php
--- PublicModels.php

-- views
--- default
---- index.php
--- admin
---- index.php

-- messages
--- en
---- module.php
--- ru
---- module.php

-- Module.php
-- composer.json
Первый вариант хорош тем что исходя из структуры advanced приложения, модулю можно быстро и удобно сменить "controllerNamespace" что позволит использовать в нужном приложении только доступные для этого приложения контроллеры и модели.
Пример:

Код: Выделить всё

'controllerNamespace' => 'vova07\users\controllers\frontend'
'controllerNamespace' => 'vova07\users\controllers\backend' 
Для универсальности данная структура плоха тем, что делает разделение модуля, там где она вообще может не быть. Например в basic. Хотя вариант полностью рабочий и на универсальной основе.

Второй вариант хорош тем что он универсален и будет работать в любой структуре как родной. Единственный минус это плохая разделяемость frontend\backend функционала, и необходисть в больших настройках для этих целей.
Для безопстного разделения, было бы желательно использовать роли RBAC которые передаются через настройки модуля и подставляются в параметрах поведения "yii\filters\AccessControl" backend контроллера.
Аватара пользователя
Faenir
Сообщения: 292
Зарегистрирован: 2010.01.06, 01:46
Откуда: Симферополь

Re: Модули

Сообщение Faenir »

Первый вариант - интересный, но как-то теряется смысл всей стуктуры advanced. Я так понимаю весь модуль будет лежать в /common/modules/{MODULE_NAME}/?
Мне не нужна универсальность, модули будут использоваться только на структуре advanced. Как в таком случае будет лучше? Три папки одного модуля?

Пытаюсь организовать структуру из трех модулей с одним названием в frontend, backend и common, сейчас вот такая проблема:
  • есть модуль, допустим Users
  • он разделен на три части: common\modules\users\Users, frontend\modules\users\Users и backend\modules\users\Users
  • модули фронтенда и бэкенда наследуются от общего

    Код: Выделить всё

    class Users extends \common\modules\users\Users
  • собственно проблема: я хочу сделать базовые классы для \yii\base\Module, \yii\base\Model, \yii\web\Controller и т.д., от которых будет наследоваться всё.
    Причем мне нужно, чтобы они так же были разделены на frontend/backend/common, но при такой структуре приходится наследоваться от \common\modules\users\Users, а там уже не понятно фронтенд это или бэкенд.
Если кто понял о чем я, помогите пожалуйста. А то я уже и сам запутался. Могут тут помочь трейты?

Так же хотелось бы узнать мнение samdark'а по поводу организации модульности в advanced структуре. Все таки структура уже официальная - из коробки)
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Модули

Сообщение zelenin »

MrArthur писал(а):Причем мне нужно, чтобы они так же были разделены на frontend/backend/common, но при такой структуре приходится наследоваться от \common\modules\users\Users, а там уже не понятно фронтенд это или бэкенд.
не понял момент. Зачем от модуля наследовать, если, видимо, нужно наоборот.
Аватара пользователя
Faenir
Сообщения: 292
Зарегистрирован: 2010.01.06, 01:46
Откуда: Симферополь

Re: Модули

Сообщение Faenir »

https://github.com/vova07/yii2-start/bl ... /Users.php

Тут вот идет наследование:

Код: Выделить всё

class Users extends \common\modules\users\Users
А в \common\modules\users\Users уже идет:

Код: Выделить всё

class Users extends Module
А я хочу, чтобы в \common\modules\users\Users было либо

Код: Выделить всё

class Users extends \path\to\BaseFrontendModule
либо

Код: Выделить всё

class Users extends \path\to\BaseBackendModule
т.е. грубо говоря, чтобы:
/backend/protected/modules/users/Users.php наследовался от \path\to\BaseBackendModule
а /frontend/protected/modules/users/Users.php наследовался от \path\to\BaseFrontendModule
но тогда теряется свзяь с common модулем.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Модули

Сообщение zelenin »

BaseFrontendModule наследуйте от common. Любые же вариации наследования возможны.

CommonBase->Common->FrontBase->Front или CommonBase->FrontBase->Front
Аватара пользователя
vova07
Сообщения: 1004
Зарегистрирован: 2012.11.29, 14:52
Откуда: Chisinau, Moldova

Re: Модули

Сообщение vova07 »

@MrArthur Структуры которые я описывал предполагались для модулей которые публикуются на https://packagist.org и предполагал ответ на вопрос @maleks.
В вашем случае, при сипользовании advanced приложения, идеально использовать то что рекомендуют разработчики, то есть три папки. Проблем не будет.
А проблема которую вы описали, заключается в неправильной логики проектирования. @zelenin подсказал правильный вариант. В протифном случае, по той логике что вы предложили, теряется не только связь с common но и принцип advanced структуры.
Аватара пользователя
Faenir
Сообщения: 292
Зарегистрирован: 2010.01.06, 01:46
Откуда: Симферополь

Re: Модули

Сообщение Faenir »

zelenin, vova07, спасибо за помощь!
Еще один вопрос)
Как будет правильнее/удобнее/лучше организовать ядро системы? Т.е. обязательную часть, которая будет нужна во всех проектах.
Вынести всё в модуль, как это реализовано в yupe? https://github.com/yupe/yupe/tree/0.7-b ... dules/yupe
/common/modules/core/components/actions/InLineEditAction.php
/common/modules/core/components/controllers/FrontController.php
Или раскидать прям по приложению?
/common/components/actions/InLineEditAction.php
/common/components/controllers/FrontController.php
Аватара пользователя
vova07
Сообщения: 1004
Зарегистрирован: 2012.11.29, 14:52
Откуда: Chisinau, Moldova

Re: Модули

Сообщение vova07 »

Тут дело вашего вкуса. Как вам нравится так и делаете. Если удобно модулями, делайте на них, если нет, делайте каркас, который всегда будет наполнятся. В общем тут правильного варианта нет, есть только предпочтения.
Аватара пользователя
Faenir
Сообщения: 292
Зарегистрирован: 2010.01.06, 01:46
Откуда: Симферополь

Re: Модули

Сообщение Faenir »

Спасибо еще раз! Мой вкус мне подсказывает делать отдельным модулем, что бы все лежало в одном месте)
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: Модули

Сообщение maleks »

MrArthur писал(а):Спасибо еще раз! Мой вкус мне подсказывает делать отдельным модулем, что бы все лежало в одном месте)
vova07 выше описал этот вариант. Лежит в common, а пространства имен контроллеров разделены через namespace
Аватара пользователя
Faenir
Сообщения: 292
Зарегистрирован: 2010.01.06, 01:46
Откуда: Симферополь

Re: Модули

Сообщение Faenir »

maleks писал(а):vova07 выше описал этот вариант. Лежит в common, а пространства имен контроллеров разделены через namespace
Мы же все таки пришли к выводу, что для advanced приложения, если не нужно будет использовать модули в basic и т.п., модуль надо делить на 3 части:

Код: Выделить всё

frontend/modules/{MODULE_NAME}
backend/modules/{MODULE_NAME}
common/modules/{MODULE_NAME}
Так что - "все лежало в одном месте" == "принадлежало одному модулю, который разбит на 3 папки".
Это сообщение относилось к организации "ядра" системы (базовые классы, хелперы, урл менеджер и т.д.), что-то вроде этого: https://github.com/yupe/yupe/tree/0.7-b ... dules/yupe

Код: Выделить всё

/**
 * YupeModule файл класса.
 * Модуль yupe - основной модуль Юпи!
 *
 * Модуль yupe содержит в себе все основные компоненты, которые используются другими модулями
 * Это наше ядрышко.
Аватара пользователя
Faenir
Сообщения: 292
Зарегистрирован: 2010.01.06, 01:46
Откуда: Симферополь

Re: Модули

Сообщение Faenir »

Так я и не понял, как реализовать правильно наследование... :(

Модуль разделен на 3 части:
frontend/modules/{MODULE_NAME}
common/modules/{MODULE_NAME}
backend/modules/{MODULE_NAME}
Нужно, чтобы базовый класс Module был тоже разделен на frontend/common/backend и все наследовать от одного в common:
frontend/modules/{MODULE_NAME} -> BaseFrontendModule -> common/modules/{MODULE_NAME} -> BaseCommonModule -> yii/base/Module
backend/modules/{MODULE_NAME} -> BaseBackendModule -> common/modules/{MODULE_NAME} -> BaseCommonModule -> yii/base/Module
А получается, что приходится выбирать:
либо отказаться от разделения базовых модулей на фронтенд/бэкенд:
frontend/modules/{MODULE_NAME} -> common/modules/{MODULE_NAME} -> BaseCommonModule -> yii/base/Module
backend/modules/{MODULE_NAME} -> common/modules/{MODULE_NAME} -> BaseCommonModule -> yii/base/Module
либо отказаться от использования общего модуля (common/modules/{MODULE_NAME}):
frontend/modules/{MODULE_NAME} -> BaseFrontendModule -> BaseCommonModule -> yii/base/Module
backend/modules/{MODULE_NAME} -> BaseBackendModule -> BaseCommonModule -> yii/base/Module
А я хочу, что бы у фронтенда и бэкенда были два независимых базовых модуля, которые наследуются от общего BaseCommonModule, и при этом должна быть возможность модули фронтенда и бэкенда наследовать от общего модуля (common/modules/{MODULE_NAME}), что бы не дублировать код на фронтенде и бэкенде.
Именно возможность.. потому что модуль может быть ТОЛЬКО для фронтенда или ТОЛЬКО для бэкенда. Тогда common/modules/{MODULE_NAME} не нужен вообще.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Модули

Сообщение zelenin »

непонятно, что вы хотите. Что значит "приходится выбирать". Наследуйте как хотите от чего хотите. В чем проблема?
И вообще зачем вам нужно так усложнять?
Ответить