Правильно понимаю, у вас структура аналогичная тому, что я привел? Т.е. внутри монорепозитория, непосредственно в директорииsrc классы не по PSR (присутствует что-то вроде framework-bundle/src/?
вы забываете про монорепозиторий. Само собой такое разделение на тесты и код лучше, но в монорепе оно не будет работать.
Скоро не будут :)Removed support for bundle:controller:action syntax to reference controllers.
С появлением_instanceof
и!tagged
CompilerPass
уже и не нужны. Я ими давно не пользовался, по крайней мере.
CompilerPass
, особенно в публичных бандлах где нужна обратная совместимость. Согласен с вами, наверное можно отказаться от бандлов в проекте. Какие нюансы?
Я буду больше работать по паттерну CQRS.
В защиту скажу, что c использованием монорепозитория по-другому не получится (ну или как минимум, у монорепы будет хитрувыдоманный автолоад, вместо лаконичного).
{
"autoload": {
"psr-4": {
"Sylius\\": "src/",
}
},
"autoload-dev": {
"psr-4": {
"Sylius\\Tests\\": "tests/"
}
}
}
С появлением autowiring все бандлы заменяются, грубо говоря, одной строчкой
src
у вас не только сервисы и регистрировать все подряд в контейнере неправильно. Есть конечно exclude:
, но он не буде работать если делать иерархию модулей. Лучше в каждом модуле добавить свой конфиг:services:
_defaults:
autowire: true
autoconfigure: true
public: false
App\Blog\:
resource: '../../../*'
exclude: '../../../{DependencyInjection,Entity}'
Kernel
:class Kernel extends BaseKernel
{
private const CONFIG_EXTS = '.{php,xml,yaml,yml}';
protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader)
{
// ...
// load configs from modules
$loader->load($src_dir.'/*/Resources/config/*'.self::CONFIG_EXTS, 'glob');
}
}
{# @controller AppBlogBundle:Home:index #}
{# @controller AppBundle:Blog/Controller/Home:index #}
Теперь понял, что такое бандл окончательно. Это получается как адаптер под какой-то фреймворк, необязательно симфони.
Это очень важный комментарий) У меня тоже возникал этот вопрос и это правда лишний гемор. Об этом я долго думал. Было решение на эту тему сначала клонировать в проект репозиторий в какую-то папку, например, пакеты. Уже от туда к фреймфорку подключать как локальный репозиторий.
Теперь окончательно понял, что это нужно делать именно так. Можете ли скинуть пару ссылок на подобную архитектуру из открытого проекта, если у вас такой есть. Или же пример чужого проекта. Есть небольшие вопросу по этому. Если с контроллерами, сущностями, сервисами всё понятно, то как работать с ресурсами, видами (шаблонизаторами), переводами. их тоже нужно хранить вsrc/Events
или же они будут общими для всего приложения? Было бы не плохо всё таки ссылочку) Хочется начать проект качественно сразу. А пока не очень представляю архитектуру таких сервисов
BoShurik скидывал ссылку на Sylius . Это то, о чём вы говорите или нет?
LICENSE
, composer.json
, phpspec.yml.dist
, phpunit.xml.dist
и т.д./src/
/tests/
src
содержит исходный код компонента, модуля и т.д., а папка tests
содержит тесты этого компонента. Я не считаю правильным смешивать исходный код и тесты. Тоже касается модулей. К тому же это может затруднить запуск тестирования всего проекта если тесты зарыты куда-то глубоко. Я предпочитаю продублировать структуру папок со списком всех модулей из корневой папки проекта src
в такую же корневую попку проекта tests
. То есть, получается так:src/Blog/Entity
src/Blog/Services
src/Events/Entity
src/Events/Services
tests/Blog/Entity
tests/Blog/Services
tests/Events/Entity
tests/Events/Services
src/Blog/Resources/templates
.templates
. Я рекомендую вынести шаблоны и организовать их по модулям, примерно в следующую структуру:templates/Blog/index.html.twig
templates/Blog/layout.html.twig
templates/Events/index.html.twig
templates/Events/layout.html.twig
templates/base.html.twig
templates/index.html.twig
templates/layout.html.twig
src/Blog/Resources/translations/messages.ru.yml
.messages.ru.yml
я не советую. Лучше добавить для переводов translation domain по названию модуля и получить Blog.ru.yml
и Events.ru.yml
.autowire
и autoconfigure
с путями к сервисам в конкретном модуле. Там пропишете псевдонимы сервисов модуля и проставите теги сервсиам модуля. Я не советую регистрировать сервисы модуля в глобальном конфиге /config/services.yml
.src/Blog/Controller/
src/Blog/Entity/
src/Blog/Services/
src/Blog/Resources/config/doctrine.yml
src/Blog/Resources/config/services.yml
src/Blog/Resources/translations/messages.ru.yml
src/Events/Controller/
src/Events/Entity/
src/Events/Services/
src/Events/Resources/config/doctrine.yml
src/Events/Resources/config/services.yml
src/Events/Resources/translations/messages.ru.yml
tests/Blog/Entity/
tests/Blog/Services/
tests/Events/Entity/
tests/Events/Services/
templates/Blog/index.html.twig
templates/Blog/layout.html.twig
templates/Events/index.html.twig
templates/Events/layout.html.twig
templates/base.html.twig
templates/index.html.twig
templates/layout.html.twig
App/Blog/Controller
App/Blog/Entity
App/Events/Controller
App/Events/Entity
App/Blog/AppBlogBundle
App/Events/AppEventsBundle
И правильно. Спамеры под тором отправляются в бан, а с ними и те кто пользуются тором ибо нефиг.
С этим тоже можно бороться.
Вообще, лучший способ спрятаться, это не прятаться за Tor, noscropt и doNotTrack, а наоборот, использовать наиболее популярное устройство с наиболее популярным браузером. Тот же iPhone.