Как стать автором
Обновить

Комментарии 33

Действительно, не знал про этот способ. Спасибо.

Раздел с созданием скелета бандла — спорный. Гораздо проще использовать стандартный composer init, т.к. в вашем случае удалить придется гораздо больше, чем создать. К тому же вы добавляете лишние зависимости (по сути бандл должен зависеть только от symfony/framework-bundle, как минимум symfony/flex, sensio/framework-extra-bundle и symfony/lts — лишние)


Ну а в остальном создание ничем не отличается от других версий Symfony

На счёт `symfony/flex` и `symfony/lts` в принципе могу согласиться, тем более, что они автоматом ставятся в любой проект, который использует Symfony 4, а вот `sensio/framework-extra-bundle` тут действительно нужен. Он необходим для роутинга через аннотации.
тем более, что они автоматом ставятся в любой проект, который использует Symfony 4

Речь идет о новых проектах, использующих flex. Если кто-то обновил свое приложение с 3.4 до 4 и захочет поставить ваш бандл, он очень не обрадуется появившемуся flex, который внезапно переопределит все конфиги :)


а вот sensio/framework-extra-bundle тут действительно нужен. Он необходим для роутинга через аннотации.

Не рекомендуется использовать такого рода "магию" в бандлах. Равно как и использование автовайринга и автоконфигрирования: Best Practices for Reusable Bundles


Services should not use autowiring or autoconfiguration. Instead, all services should be defined explicitly.
extra bundle для роутинга не нужен. там добавляется лишь возможность лепить аннотацию на сервис что не очень актуально.
С некоторых пор для аннотаций роутинга extra не нужен.
Аннотация @Route действительно берётся не из extra бандла, однако, может я что-то не так делал, но при подключении бандла и добавлении файла с роутингом с типом «annotation» роуты не подтягивались, пока я не поставил extra. Собственно поэтому я и добавил этот бандл в зависимости
А какая версия Symfony? В 3.3 ещё нужен был extra, в 3.4 уже нет.
В моём случае 4.1 вообще
Как надо делить бандлы: по теме (пользователи, новости) или по функциональности (аутентификация, работа с файлами). Или допустимы оба варианта?
Моё мнение — по функциональности, хотя и по теме тоже можно. Например, у нас есть самописный бандл, отвечающий за отправку сообщений в Kafka, у каждого микросервиса, к которому обращаются другие микросервисы, есть свой клиентский бандл, есть бандл авторизации, который содержит кастомную аннотацию, которая добавляет авторизацию к тому или иному action'у контроллера — это что касается функционального разделения. В то же время есть и тематический бандл, который отвечает за определение, с какого именно интернет-магазина (у нас их несколько) пришёл запрос и содержит общие константы, URL'ы и кучу разной статической информации.

Моё мнение — как удобно, так и делите, другое дело, что бандл не должен быть монструозным и содержать чрезмерное количество разрозненного функционала, это не должен быть мини-монолит, который вы таскаете между проектами.
Тоже к этому пришел: оба варианта.
бандл не должен быть монструозным

Зависит от виртуозности разработчика :) К этому надо стремиться, в этом случае правило unix очень кстати: «сделай мало, но хорошо», главное чтобы не получилось как в npm.
главное чтобы не получилось как в npm

с npm проблема только одна — разработчики npm-а которые… ну я могу долго тут их ругать за то что у них странные приоритеты и странное отношение к понятию lock файл. Но главный их косяк — отсутствие возможностти подписывать пакеты, дабы исключить возможность подмены как это случалось не однократно (что приводило к веселым новостям о том что eslint слил чьито ключи в сеть).


Что до "сделай мало но хорошо" — посмотрите на штуки типа grep, less и т.д. Я не могу сказать что они мало делают. Ну то есть… проблема этого "мало" в том что это относительное понятие и оно для каждого свое.


Суть не в том что бы там чего-то было "мало" или "много" а в том, что бы причины для изменений штуки были одни и те же. Если причины разные — рано или поздно они начнут конфликтовать между собой и придется идти на компромисы. так магенты появляются (там еще избыточное обобщение и неверная стратегия "расширяемости" в стиле вротпресса).

PHP явно повезло с композером. Что до мадженты, в ней попытались воплотить многие неплохие идеи. Генерация кода (фабрик, плагинов), API через swagger, контракты, повсеместное di, следование psr.
А какая правильная стратегия расширяемости?
Вопервых проясним вопрос с терминами «темы» и «функциональность». По сути это должны быть синонимы. Во вторых ваши «пользователи» являются совокупностью разных функциональностей (и возможно должны быть разбиты), в частности это аутентификация, профили (иногда это разные профили, представьте себе убер где есть профиль пассажира и профиль водителя), есть сквозная функциональность (например у тех же профилей есть рейтинг, который неплохо выделяется в свой модуль) ну и т.д.

Во вторых на тему разделения проекта на модули (а бандлы это вид модуля) пишут книги еще с 70-х, и все сводится к тому что бы уменьшать связанность между ними и повышать cohesion. Лучше с этими вопросами попробуйте разобраться.

Скажем… типичная проблема людей, которую я наблюдал на проектах — желание разделить на бандлы и потом юзать нутро этих бандлов в других бандлах. Типа есть бандл «пользователи» и во всех остальных бандлах идут отсылки на сущность `User` из этого бандла, хотя в целом достаточно лишь айдишки (хотя логика тут ясна — так намного проще, особенно по началу, в плане выплевывания данных в шаблоны). Ну и всякие CommonBundle, CoreBundle и прочие UtilsBundle свидетельствуют о проблемах с декомпозицией на проекте.

Ну и в заключение — не надо делить проект на бандлы. Вообще. Бандлы нужны для реюза кода между проектами, что бы можно было их подключить к проекту и все. Та же аутентификация или восстановление пароля в целом неплохо обобщаются до бандла, но мне не известны примеры где это сделано хорошо (хотя скажем есть вариант подключить какой AuthN-server и не париться с бандлами, но это больше вообще к вопросу о расширении кругозора к тому как не писать код а юзать готовое).

Если вы хотите разделить проект — сделайте нэймспейс. Этого более чем достаточно.
Я считаю что нужно смотреть реалистично. В теории можно сделать идеальный проект с двадцаткой бандлов всех мастей которые делают «мало, но хорошо». На практике редко когда удается что-то отличное (ну да, квалификация и все такое). И самое главное, не факт что эта нарезанная картошка найдет свой суп в то время когда нужно приготовить пиццу. Пожалуй, такие универсальные штуки во всем может позволить себе делать разве что sensiolab.
Я бы наверное сделал бы этот самый общий User.

уменьшать связанность между ними и повышать cohesion
Вспоминаю модули в magento 2, всегда думал что это не правильно все :)

желание разделить на бандлы и потом юзать нутро этих бандлов в других бандлах
Понятно что наследование лучше избежать.

не надо делить проект на бандлы. Вообще. Бандлы нужны для реюза кода между проектами, что бы можно было их подключить к проекту и все
всякие CoreBundle
Не понял, можно иметь CoreBundle, только называть так нельзя?
Это интересный вопрос. Чаще всего приложение пишут в бандле (AppBundle) хотя насколько я понимаю разработчик продукта это не приветствует
symfony.com/doc/current/best_practices/creating-the-project.html
До Symfony 4 писали внутри бандла, в 4 от этого отказались. Теперь все файлы проекта находятся внутри директории `src` без всяких бандлов.
Насколько я понимаю так можно делать было и раньше см. knpuniversity.com/blog/AppBundle
Я конечно не сторонник там всякой отсебятины и наоборот сторонник все делать по мануалам. И меня немного удивило в одной конторе когда я обнаружил AppKernel там где его наверное никто больше не держит. Но это бесконечное bundle -bundle которое слышишь целый день немного утомляло. Интересно как реальные разработчики восприняли такое новшество. Боюсь что все по привычке держат в бандле да ещё и не в одном

ходят легенды что изначально план был дать возможность людям дробить проекты на кернелы, потому была папка app и src. В этом случае удобно было бы отдельные модули подключать в свои кернелы бандлами и т.д.


Люди неправильно поняли и начали воспринимать бандлы как модули. и дробить проект именно таким образом. Причина для этого очень и очень проста — автоконфигурация. Вы создали папку Entity внутри бандла и доктрина автоматически подтянула оттуда сущности. Вы создали папку Resources и… ну вы поняли идею.


Жить без бандлов вообще можно было в целом с самого начала. Но ключевой момент распространенных заблуждений — автоконфигурация и неудобные конфиги.


С выходом symfony 3.3 по сути конфиги симфони стали куда более удобны для "безбандальной структуры". Но проблема того, что люди структурируют проект под автоконфигурацию, все еще никуда не делась.


что до мануалов — best practice симфони появился с выходом symfony 2.8 вроде, то есть люди уже успели набомбить проектов и привыкнуть. В этом бэст практис покрывался вопрос что нет смысла дробить на бандлы но опять же автоконфигурация а потому "если хотите бандл — не делите ничего а юзайте AppBundle".

Скорее заготовки под кернелы/приложения — наследие symfony 1.*, фича которой часто пользовались для, например, разделения публичной части и админки. Но особо востребованности не было и забили.
По-моему, уже в 3.3 отказались от бандла, причём по тихому так, уже после релиза, ближе к 3.4
В теории можно сделать идеальный проект с двадцаткой бандлов всех мастей которые делают «мало, но хорошо»

еще раз — не надо делить проект на бандлы. Бандлы для реюза кода между проектами, инфраструктура какая-то, обобщенный функционал. Например вам надо быстро прикрутить websockets — ставим centrifugo bundle. Бизнес логики в бандлах быть не должно.


Я считаю что нужно смотреть реалистично.

То есть забить просто и не пытаться даже делать нормально декомпозицию? ну ладно.


Вспоминаю модули в magento 2

магенту это вообще страх и слезы.


Понятно что наследование лучше избежать.

причем тут наследование? В целом когда у вас есть модуль Users и еще десяток и все юзают сущность из этого бедного модуля Users, хотя им только айдишка нужна. И это самый лайтовый пример факапов.


Не понял, можно иметь CoreBundle, только называть так нельзя?

Суть не в названии, вы же это понимаете. Я сейчас говорю о разделении приложения на модули. То есть вы можете сделать какой-нибудь модуль Infrastructure, но там не должно быть сущностей и бизнес логики.

То есть забить просто и не пытаться даже делать нормально декомпозицию? ну ладно.
Пытаться нужно, но со здравым смыслом.

Все понятно. Так-то согласен со всем.
но со здравым смыслом.

можете раскрыть мысль? Что значит "со здравым смыслом"?) Мы либо как-то по разному "декомпозицию" понимаем, либо я не знаю.

Я, если вижу что-то универсальное, попробую вынести это как отдельный composer-пакет. Часто это удается. Но бывает так что плата за универсальность и повторное использование — слишком высока, в том числе и потому что модуль вряд ли будет использоваться в будущем.

Мы дискутировали по поводу форка/наследования от 3-party библиотеки. Так вот с универсальным модулем который наверняка останется специфическим для проекта (идеальные крутые вещи ведь не часто получаются), может выйти так что для использования в новом проекте придется или форкать (хе-хе), или переписывать отдельные части, что влечет фикс уже первого проекта. Я это имел ввиду.
Поэтому хороший модуль кэширования или там работу с pdf можно вынести, а вот что-то из бизнес логики я не спешил бы выносить.

P.S. И вообще, я за интерфейсы везде. Чтобы как psr log, только для всего.

я говорил про декомпозицию а не про желание обобщить все и вся. Это разные вещи.


По поводу проблем с "форками" — обычно это как раз таки проблема излишнего обобщения. Маленькие узко специализированные решения с меньшей долей вероятности нужно будет "допиливать", их проще заменять полностью. Увы у большинства философия "запихнем в эту простую штуку все".


только для всего.

Greg Young — Stop Over-Engenering — может быть вам понравится, весело задорно и в целом пересекается с темой нашего разговора.

Судя по слайдам, обещает быть веселым, дома посмотрю что там да как :)

запихнем в эту простую штуку все
Так это потому что разобрать большое на маленькое стоит больших усилий, по себе знаю. И нет уверенности что усилия окупятся.
И опять же, главное в меру, чтобы при открытии node_modules глаза на лоб не лезли.
И нет уверенности что усилия окупятся.

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


чтобы при открытии node_modules глаза на лоб не лезли.

Лайфхак — не открывайте их просто. Это нужно очень редко и главное что бы была возможность удостовериться что пакеты никто не подменил (по подписи) и что нет секьюрити ишусов у зависимостей. Сегодня это делается автоматически.

НЛО прилетело и опубликовало эту надпись здесь
Точно, это то что я писал выше в комментарии про применимость бандлов.
Сейчас хорошее использование непереиспользуемых бандлов — подготовка к разделению монолита на (микро)сервисы.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации