artem
помню что это плохо, но не знаю почему. хотел узнать
Andrey
И так постепенно придёшь к тому, что плохо
artem
тогда я и сервисы не смогу использовать
Andrey
Andrey
Контейнер нужен, когда у тебя есть циклические зависимости:
class ServiceA {
public function __construct(ServiceB $serviceB) {}
}
class ServiceB {
public function __construct(ServiceA $serviceA) {}
}
вот так ты сделать не можешь
но можешь прокинуть в ServiceB контейнер и оттуда дергать ServiceA
это уже неправильно, не должно быть такого
рефакторишь так, чтобы сервисы не вызывали друг друга
либо переносишь связанное в какой-нить сервис, чтобы друг друга не дергали
либо выносишь в отдельный сервис и уже его инъектишь
либо у тебя код общий, но делает разное и тебе не надо этот код шарить (он будет в каждом сервисе, но в данном случае это не плохо)
Юра
Плохо это тем что твой сервис зависит от контейнера
Юра
Ваш кеп
artem
так любой сервис зависит от контейнера в каком то смысле
Юра
Почему
Юра
Ты не сможешь в таком случае взять свой сервис наработку и перенести куда-то на другой проект где нету контейнера
Юра
Ты не сможешь написать нормально юнит тесты
Юра
В идеале твой сервис ничего не должен знать о контейнере
Vlad
Andrey
для работы сервиса контейнер не нужен
контейнер нужен для создания/получения сервиса
но при этом сервисы создавать можно и без контейнера, напрямую
контейнер просто упрощает работу
почитай про di, service locator, etc, может понятнее станет
Vlad
Alexander
artem
Vlad
Vlad
и в serializer это используется
artem
но вопрос был в том, что насколько это повлияет на производительность
Alexander
Циклические связи в данных и циклические связи в сервисах это совершенно не одно и тоже.
Vlad
Alexander
Так и как циклические связи сервисов используются в сериалайзере?
Vlad
Andrey
В нормлазерах очевидно же
ничегонепонимаю (с)
когда у тебя в сервисах цикл, то скорее всего сервисы писали как попало, границы не проводили и не соблюдали
в итоге получилось, что у тебя какая-то операция размазана по всему коду
другая операция лежит рядом и точно так же размазана
на выходе у тебя спагетти-код получается с высоким зацеплением, где все переплетено и чтобы пофиксить какой-нить баг, тебе может понадобиться прыгать по куче файлов, а потом окажется, что твой фикс поломал другие места, вообще не связанные с исходной задачей
а как это с сериализаторами и нормалайзерами связано не совсем понимаю
Vlad
Vlad
а то что циклические связи надо избегать, это да.
Юра
С++ на уровне языка по рукам дает за циклические связи. Неудобно там с этим
Юра
Приходится всякие forward declaration делать и все такое
Юра
Но иногда без этого никак
Alexander
Ну посмотри как он под капотом устроен и все поймешь) Времени объяснять точно нету.
Где в нормалайзерах вы какие то сервисы увидели не ясно.
Вы путаете обработку циклических связей в данных и цикличиеские зависимости в сервисах и продолжаете упорствовать.
В данных от этого никуда не денешься - если у поста есть автор, а у автора посты, то вот вам и циклическая связь которую из коробки сериалайзер не умеет обрабатывать.
Совсем другое дело, когда у вас сервис уведомлений зависит от сервиса пользователей, а сервис пользователей от сервиса уведомлений.
Andrei
Vlad
Alexander
Сериалайзер инжектится в нормалайзеры внутри конструктора
Alexander
Нормалайзеры не являются сервисами, на сколько я помню.
Vlad
Alexander
Как вы пришли к этому выводу?
Vlad
Иван
Понаставят сералайзеров. Лишь бы Джейсон сериалазбл не имплементировать
Vlad
Alexander
debug:container
Вы правы, с трудом представляю зачем нужен инстанс сериалайзера внутри нормалайзера
Иван
Если у объекта суть - отразить данные из базы и уехать на фронт, то он сам должен это реализовывать.
Иван
А если суть быть бизнес сущностью, то ей не надо на фронт. Поэтому сериалайзеры ваши - ненужная вещь.
Alexander
Юра
Сериалайзер кстати реально медленный
Юра
Я в своих апи местами убрал его нах
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
ну то что могу показать по быстрому
Иван
контроллер отдаёт записи из фетчера