Павел
Соглашусь, как то топорно ) С другой стороны - проблема решена без всяких заморочек, но отследить потом, где что вызывается кроме поиску по файлам сложновато.
Я бы наверное какой нить фулстейт логгер-регистр написал, который слушает ивенты или вызывается точечно. А перед записью из него достаются данные. Главное не забыть очищать.
Без фулстейта как красиво - чет хз.
Null
Null
Я бы вообще их ридонли сделал.
Сергей
Коллеги привет, поделитесь пожалуйста проверенным набором плагинов для симфы под VSCode
Kirill
Всем привет! Как вы считаете, компоненты (модули) должны вызывать сервисы из других компонентов?
У нас в проекте такая структура, что в src лежат директории с компонентами, например, user, profile, department и тд. В каждом компоненте свои контроллеры/подписчики/репозитории/сервисы. Дальше сервисы из одного компонента могут быть использованы в других, но другие сущности (например, репозитории) должны использоваться только в своем компоненте.
У меня вопрос: следуя рекомендации по сильному зацеплению/слабой связанности, не должны ли компоненты общаться между собой только через события? Например, создали нового пользователя, отправили событие UserCreated и в других компонентах подписались на это событие и что-то сделали?
Юра
Должны да
Sergey
Тут вроде об этом поднималась тема
https://elisdn.ru/blog/149/code-structure
Юра
Если представить модуль как некий блек бокс, то я бы предоставил наружу длч взаимодействия с этим модулем некий интерфейс
Юра
Это если нужно прямое взаимодействие
Юра
Фасад паттерн короче возможно использовал бы. Он бы скрыл детали реализации модуля, и предоставил один интерфейс для взаимодействия
Null
Юра
Юра
Короче мне кажется невозможно написать код который удовлетворит все паттерны
Александр
Всем привет подскажите. Добавил в таблицу в БД новый столбец, без миграции. Прописал в Entity, но findBy возвращает null в этом поле... Симфони не знаю, но нужно правку внести...
Сергей
кеш чистили?
Ibray
Ibray
самое простое прикинул 😁😁😁 не судите если не помог)
Nikolay
Eugene
Привет, народ. Нужна помощь коллективного разума :)
Ищу библиотеку для clickhouse под doctrine 3. Может кто натыкался на незаброшенный и развивающийся проект?
Из того, что нагуглено - нет нормального ORM и миграций, и версия доктрины заморожена на 2.
А с нуля писать не очень-то охото.
Konstantin
честно говоря, кликхаус херовато ложится на доктрину - очень много всяких функций и не совсем стандартных sql-конструкций. пытаться натянуть ежа на глобус можно, но это поистине титанический труд. я бы советовал селектить руками оттуда (всё равно на выходе нужны не сущности, а какие-то агрегаты), а писать через файлы
Konstantin
если что, у меня ~петабайт кликхауса будет через пару месяцев, я уж по-всякому пытался к нему прорваться
Eugene
Konstantin
если вы храните сущности в кх - вы, похоже, что-то делаете не так
Konstantin
из кх, типа, надо селектить грубо говоря что-то вроде select avg(summ) from order
Alexey
Звучит странно. Какие в КХ сущности и зачем над КХ ORM?
Konstantin
++
Nikolay
Наверное очень много бизнес логики (нет)
Kirill
Всем привет! Подскажите, а в чем минусы использования трейтов? Понимаю, что иногда они очень уместны, иногда нет, но очень часто слышу, что трейты - это говно) А почему?
Eugene
Ну, там по разному. Есть статистика - там реально, проще описать сущность, заполнить ее из реквеста и пачкой записать к КХ.
И есть агрегаты, для удобства работы агрегированные данные из КХ запихать в сущности от отдать в респонс.
Единообразие, я ж говорю. Бизнес-логика ни причём.
Konstantin
> эмитируют?
в программировании появился термин "эмиссия"?
Dmitry
Dmitry
Null
Всем привет! Подскажите, а в чем минусы использования трейтов? Понимаю, что иногда они очень уместны, иногда нет, но очень часто слышу, что трейты - это говно) А почему?
С трейтами все сложно.
Я предпочитаю их рассматривать как некая метка, которая функционал привносит. Пример - timestampable, blamable. Такие штуки.
Должна быть логическая причина.
Но трейты очень любят как попало втыкать, что потом концов не сыщешь.
Самый хороший пример - когда один трейт вызывает методы другого трейта. Или методы класса, в который он добавлен.
Вот тут уже надо думать над нормальным наследованием, а не трейтами вмазываться.
Dmitriy
Или наследование отправить туда же вместе с трейтами
Null
А с наследованием-то что не так?
Понятно, что композиция предпочтительнее. Но иногда-то почему нет?
Vlad
легко переопределить поведение
Dmitriy
Null
На самом деле, пожалуй, во всех 😁
Dmitriy
если от абстрактного, то тут надо очень внимательно контроллировать, скорее всего решили общую логику выделить, а потом через полгода можно "приплыть". Ту же саму общую логику можно вынести в отдельный класс и внедрять как зависимость
Юра
Наследование плохо масштабируется как по мне
Юра
Быстро становится запутанным
Nikolay
Юра
Когда чайл дергает парент метод, тот дергает другой метод, который переопределен в середине наследования и прыгает вот так туда сюда по иерархии. Ну и иногда молель данных не очень ложится на чисто парент чайлд наследование
Dmitriy
в итоге парент становиться god object
The Ant
Konstantin
Konstantin
херово когда приложение в памяти копит логи - во-первых, потребление памяти сильно растет, во-вторых, надежность: ты порестартил контейнер и потерял пачку логов
The Ant
Обычно рестарт таких приложений крайне редкое явление.
Для немедленного сохранения можно и отдельные ендпоинты сделать.
Konstantin
не, моё дело предложить, зачем мне с тобой спорить
The Ant
для статистики например не проблема потерять пару тыщ записей на несколько десятков миллионов
The Ant
та я не спорю, понимаю что есть данные, которые нельзя потерять, но это редкий кейс
The Ant
по крайней мере для использования кликхауса
Konstantin
как миниум, батчить логи в памяти, не особо 12-факторно
The Ant
кх не только для логов же
The Ant
да и логи обычно дублируются в файлы
Kirill
Всем привет! Подскажите, как можно подключить все контроллеры в файл с роутингом? В src создаю директории с модулями, каждый модуль содержит директории, в том числе директорию Controller. В routes.yaml хочу одной инструкцией их подключить, например вот так:
controllers:
resource: '../src/*/Controller'
type: annotation
Но ничего не получается)
Юра
Юра
Controller/*
Павел
Павел
Controller/*
Даже интересно сработает или нет, так как вложенность при стандартном кейсе работает и без звезды :)
Nikolay
Dmitriy
Dmitriy
Nikolay
Kirill
Dmitriy
а мы просто ставим атрибут AsController
Dmitriy
и теперь контроллер может находиться в любом неймспейсе
Kirill
Я не представляю, как можно добиться того, чтобы внутри модуля не было обращений в другие модули. Сущности все связаны между собой, сегодня не нужно две сущности вместе отдавать, а завтра нужно. Не таскать же контроллеры туда -сюда. Кроме того, мне кажется странным, что часть контроллеров и репозиториев лежат внутри модулей, а часть снаружи. Поэтому у нас модуль - это просто логически связанные файлы, но модуль может получать данные из других модулей
Nikolay
Kirill
Есть публичный интерфейс у модуля, через него взаимодействие или через события
Через события я представляю частично, как можно работать. Подскажите, что такое публичный интерфейс? Слышал про это, не понимаю что это значит)
А по поводу событий - как они помогут, если нужно отдать данные? Вот на примере: нужно мне вместе с товаром теги отдавать, я вызову ProductController, который вызовет ProductService, который в свою очередь вызовет ProductRepository или ProductQuery, которые в свою очередь сходят в две таблицы и отдадут данные. А у вас бы как это выглядело?
Nikolay
Kirill
У нас в проекте порядка 50 модулей. В трети из них контроллеры возвращают данные из нескольких сущностей. Это какая каша получится?)
Kirill
Что такое публичный интерфейс?) Это как выглядит?
Dmitriy
https://milestone.topics.it/series/view-model-composition.html