artem
помню что это плохо, но не знаю почему. хотел узнать
Andrey
та тут в том и проблема. это сделал не я. попросили сделать код ревью
Даже если там по ссылке настроено, сразу в печку. "что-то делаешь не правильно" Контейнер нужен в основном, если говнокодить кто-то собрался
Andrey
помню что это плохо, но не знаю почему. хотел узнать
Начни с обратного: что будет, если ты удалишь контейнер?
Andrey
И так постепенно придёшь к тому, что плохо
artem
тогда я и сервисы не смогу использовать
Andrey
Контейнер нужен, когда у тебя есть циклические зависимости: class ServiceA { public function __construct(ServiceB $serviceB) {} } class ServiceB { public function __construct(ServiceA $serviceA) {} } вот так ты сделать не можешь но можешь прокинуть в ServiceB контейнер и оттуда дергать ServiceA это уже неправильно, не должно быть такого рефакторишь так, чтобы сервисы не вызывали друг друга либо переносишь связанное в какой-нить сервис, чтобы друг друга не дергали либо выносишь в отдельный сервис и уже его инъектишь либо у тебя код общий, но делает разное и тебе не надо этот код шарить (он будет в каждом сервисе, но в данном случае это не плохо)
Юра
Плохо это тем что твой сервис зависит от контейнера
Юра
Ваш кеп
artem
так любой сервис зависит от контейнера в каком то смысле
Юра
Почему
Юра
Ты не сможешь в таком случае взять свой сервис наработку и перенести куда-то на другой проект где нету контейнера
Юра
Ты не сможешь написать нормально юнит тесты
Юра
В идеале твой сервис ничего не должен знать о контейнере
Andrey
для работы сервиса контейнер не нужен контейнер нужен для создания/получения сервиса но при этом сервисы создавать можно и без контейнера, напрямую контейнер просто упрощает работу почитай про di, service locator, etc, может понятнее станет
Alexander
так любой сервис зависит от контейнера в каком то смысле
__construct(Container $container) __construct(SomeService $someService) Как вы пришли к выводу, что в любом случае присутствует зависимость от контейнера?
Andrey
с помощью сеттеров можно сделать цикличскикую связь) Иногда это полезно.
чаво? зачем? циклическая зависимость сама по себе вещь плохая зачем ее юзать? тогда уж на плюсах писать лучше - быстрее без ног останешься
Alexander
посмотри sf serializer,там это используется
Причем тут сериалайзер и контейнер, вы же не сериализуете сервисы.
Vlad
и в serializer это используется
artem
но вопрос был в том, что насколько это повлияет на производительность
Alexander
Циклические связи в данных и циклические связи в сервисах это совершенно не одно и тоже.
Alexander
Так и как циклические связи сервисов используются в сериалайзере?
Andrey
В нормлазерах очевидно же
ничегонепонимаю (с) когда у тебя в сервисах цикл, то скорее всего сервисы писали как попало, границы не проводили и не соблюдали в итоге получилось, что у тебя какая-то операция размазана по всему коду другая операция лежит рядом и точно так же размазана на выходе у тебя спагетти-код получается с высоким зацеплением, где все переплетено и чтобы пофиксить какой-нить баг, тебе может понадобиться прыгать по куче файлов, а потом окажется, что твой фикс поломал другие места, вообще не связанные с исходной задачей а как это с сериализаторами и нормалайзерами связано не совсем понимаю
Vlad
а то что циклические связи надо избегать, это да.
Andrey
Ну посмотри как он под капотом устроен и все поймешь) Времени объяснять точно нету.
знал бы прикуп - жил бы в Сочи знал бы куда смотреть - посмотрел бы ))) а так: ничегонепонимаю (с) 😈
Юра
С++ на уровне языка по рукам дает за циклические связи. Неудобно там с этим
Юра
Приходится всякие forward declaration делать и все такое
Юра
Но иногда без этого никак
Alexander
Ну посмотри как он под капотом устроен и все поймешь) Времени объяснять точно нету.
Где в нормалайзерах вы какие то сервисы увидели не ясно. Вы путаете обработку циклических связей в данных и цикличиеские зависимости в сервисах и продолжаете упорствовать. В данных от этого никуда не денешься - если у поста есть автор, а у автора посты, то вот вам и циклическая связь которую из коробки сериалайзер не умеет обрабатывать. Совсем другое дело, когда у вас сервис уведомлений зависит от сервиса пользователей, а сервис пользователей от сервиса уведомлений.
Alexander
Но иногда без этого никак
А есть пример? Ради спортивного интереса 🙂
Andrei
Alexander
Сериалайзер инжектится в нормалайзеры внутри конструктора
Alexander
Нормалайзеры не являются сервисами, на сколько я помню.
Alexander
Как вы пришли к этому выводу?
Иван
Понаставят сералайзеров. Лишь бы Джейсон сериалазбл не имплементировать
Alexander
debug:container
Вы правы, с трудом представляю зачем нужен инстанс сериалайзера внутри нормалайзера
Иван
Если у объекта суть - отразить данные из базы и уехать на фронт, то он сам должен это реализовывать.
Иван
А если суть быть бизнес сущностью, то ей не надо на фронт. Поэтому сериалайзеры ваши - ненужная вещь.
Юра
Сериалайзер кстати реально медленный
Юра
Я в своих апи местами убрал его нах
Alexander
Это верно и про пхп, который в некоторых апи уместно заменять голенгом, например
Юра
Ну ну у меня там энтити, рилейшены и все такое
Юра
Просто из квери сраху гидрейт эррэй и все
Alexander
Ну так это не сериалайзер же тормозит, а гидрация
Alexander
Не очень понимаю про объект, суть которого отобразить данные на фронт. Дто который сам себя сериализует?
Юра
Ну почему
Юра
Если не хидрейт эррэй тогда тебе доктрина сначала из массивов в объекты, потом облекты сериалайзером обратно в массивы
Юра
Это не заметно особо пока у тебя нет вложенных сущностей и их не так много
Юра
Но в легкую 100-200 мс потом один только сериалайз забирает
Alexander
Ну массив то потом все равно надо или в сериалайзер или в json_encode запихать
Юра
Офкорс
Alexander
Это момент, который в целом заставляет искать альтернативы пхп. Пока эррей быстрее объектов ОПП в пхп выглядит как пятая нога.
Юра
Эррэй который на самом деле не эррэй
Alexander
ну да
Юра
Под капотом
Юра
А Голанг неплох, не спорю
Alexander
https://github.com/glavweb/GlavwebDatagridBundle я раньше на не очень больших проектах юзал этот бандл, очень удобно и очень быстро - и работает, и код пишется
Alexander
https://habr.com/ru/post/303366/ пост про бандл
Иван
Поясните пожалуйста примером
отделение чтения от записи вместо считывания доктриновской сущностей мы делаем простые запросы за простыми объектами, которые сами себя умеют в джейсон превращать
Alexander
Звучит не очень просто, пахнет CQRS и вызывает много вопросов )
Alexander
Стараюсь обходить стороной такие сложности, потом не найдешь никого на поддержку. Если предметная область требует ддд, или нагрзуки требуют cqrs то выбор пхп на мой взгляд сомнителен.
Иван
и запросы на обновление и создание - это именно команды создания и обновления, а не сами бизнес сущности
Alexander
Без примера тяжело, я туповат, плохо такие вещи на словах понимаю. Если есть под рукой ссылка чтобы кинуть в меня буду признателен. На команду, на запрос. То что я видел - страх и ужас, который обычно на нагрузках не работает совсем.
Иван
https://github.com/Punk-UnDeaD/simplenews/blob/master/src/SimpleNews/Controller/StoryController.php ну то что могу показать по быстрому
Иван
контроллер отдаёт записи из фетчера