Юра
С пустыми полями
Юра
От этого и нулабл ошибка
Roman
да, дебажу. Спасибо большое
Anonymous
Hi everybody
꧁༒Dmitry༒꧂
введи каптчу
Andrey
берется она из foreach($message->getOrder()->getOrderItems() as $orderItem)
Ентити из ем загрузи, а не из сообщения доставай и будет счастье (наверное)
Roman
Ентити из ем загрузи, а не из сообщения доставай и будет счастье (наверное)
Да, получилось. Из сообщения десериализовалось иное entity. Получил из бд, все стало чики-пуки. Спасибо всем неравнодушным!
Юра
А что за фишка у телеги такая
Юра
Долгим нажатием на картинку чата в списке чатов вызывается
Юра
Какой-то драг энд дроп непонятный
Юра
Типо превью?
Andrey
Типо превью?
Так можно сообщения смотреть "не читая"
Andrey
Удобно
Юра
Только оно не скролит вниз
Юра
А запоминает последнюю позицию чата вроже
Юра
Т.е. ты не видишь новые сообщения
Дмитрий
в декстопе не работает ((
Shokha
Добрый день! По советуйте по архитектуру! Как я вижу: Я хочу создать одно приложение, это приложение используется разными пользователями(продавец), у каждого пользователя есть собственная БД (также свои собственные клиенты). У каждого пользователя будет subdomen! Допустим есть 3 пользователя foo.example.com bar.example.com baz.example.com вот если запрос приходить из foo.example.com тогда backend должен работать с базой foo_db если bar.example.com тогда bar_db Качество Бэка хочу использовать Symfony для БД Postgresql-12 Может я не правильно вижу все это! Можете помочь как лучше сделать? Или где можно читать о таком?
Shokha
+ база и субдомен я сам буду создать для каждого пользователя
Shokha
А что посоветовать? Сделай одну базу "сервисную" в ней держи все настройки, юзеров и их связь с доменами и базами, оплату... Остальное как написали - в отдельных базах...
Значить у меня будет основная таблица где я буду держать своих клиентов(продавцов) Потом когда каждый раз когда запрос будет стучу таблицу где хранится мои клиенты потом где совпадает домен уже переключусь к нужную ДБ исходя из субдомен если совпало ?
Shokha
PGSQL еще видел можно создать один БД и несколько схемы внутри этого БД
Shokha
А как ты миграции делать таком случае? Одно поле надо добавить, а у меня типа 28 БД уже
Dmitry
А как ты миграции делать таком случае? Одно поле надо добавить, а у меня типа 28 БД уже
Либо всё хранить в разных базах с отдельными миграциями, либо в одной базе с полем tenant_id в каждой таблице. Это уже каждый решает сам.
Shokha
Либо всё хранить в разных базах с отдельными миграциями, либо в одной базе с полем tenant_id в каждой таблице. Это уже каждый решает сам.
Добрый вечер Дмитрий! Хранить все в одном базе я всегда так делал! Но я думал может какой-то best practices есть! Если хранить разных базах то только миграции буду держать каждый проект отдельно? Или вес проект буду клонировать каждый раз?
Dmitry
Добрый вечер Дмитрий! Хранить все в одном базе я всегда так делал! Но я думал может какой-то best practices есть! Если хранить разных базах то только миграции буду держать каждый проект отдельно? Или вес проект буду клонировать каждый раз?
Это вечный вопрос мультитенантных приложений, какой вариант выбрать: - Одно приложение с одной бд. Легче всего, но есть риск забыть в каком-либо запросе указать tenant_id и показать чужие данные. И если данных у каждого клиента много, то суммарно будут огромные таблицы. - Одно приложение с несколькими бд для каждого клиента. Сложнее с миграциями, но гарантия изоляции данных каждого клиента. - Несколько приложений со своими бд. Полная изоляция, но повышенное потребление ресурсов. Актуально если под каждого клиента дорабатывается код.
Юра
Для доктрины можно написать фильтр
Юра
Чтобы не забывать указать tenant id
Александр
😄
А у меня сплав.
Дмитрий
Это вечный вопрос мультитенантных приложений, какой вариант выбрать: - Одно приложение с одной бд. Легче всего, но есть риск забыть в каком-либо запросе указать tenant_id и показать чужие данные. И если данных у каждого клиента много, то суммарно будут огромные таблицы. - Одно приложение с несколькими бд для каждого клиента. Сложнее с миграциями, но гарантия изоляции данных каждого клиента. - Несколько приложений со своими бд. Полная изоляция, но повышенное потребление ресурсов. Актуально если под каждого клиента дорабатывается код.
кмк в третьем варианте не сильно повышенное потребление (в сравнении с вариантом 2), базы все равно разные, зато полная изоляция, нет проблем с миграциями, не нужен второй коннект, а еще есть возможность чтобы один и тот же клиент мог пользоваться разными приложениями без проблем (ну это если вдруг нужна такая возможность, но как доп фича уже есть)
Shokha
еще я нашел вот это https://blogru.4xxi.com/saas-%D0%B8-%D0%BC%D1%83%D0%BB%D1%8C%D1%82%D0%B8%D1%82%D0%B5%D0%BD%D0%B0%D0%BD%D1%82%D0%BD%D0%B0%D1%8F-%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B2-symfony-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8-%D1%87%D0%B0%D1%81%D1%82%D1%8C-2-a9d7046425dd
Shokha
А что именно описать? Какие есть сложности?
Да) какие подводные камни может быть) Как более еще производительно сделать? Какие сложности нас ожидает! Как на стороне кода все это сделать (хотя я это уже понял почти но может еще кому-то надо будет)
Dmitry
Да) какие подводные камни может быть) Как более еще производительно сделать? Какие сложности нас ожидает! Как на стороне кода все это сделать (хотя я это уже понял почти но может еще кому-то надо будет)
> как на стороне кода В случае одного приложения пишем локатор подключений: class Connections { __construct($configTemplate) get($tenantId) } который будет создавать подключение по шаблону конфигов, меняя имя базы вроде str_replace($dsn, '{tenant_id}', $tenantId), и это подключение сохранять в приватный массив. И также делаем локатор Em: class EntityManagers { __construct($connections) get($tenantId) } С созданием подключения и таким же кешированием: class EntityManagers { private Connections $conns; private array $ems = []; get($tId) { if (arr_key_ex($this->ems, $tId)) { return $this->ems[$tId]; } $conn = $this->conns->get($tId); $em = new EntMngr($conn); $this->ems[$tId] = $em; return $em; } } Сократил, чтобы влезало в экран. И теперь во все сервисы инжектим эти локаторы и во все методы передаём из контроллера значение $this->getUser()->getId() в $tenantId, чтобы потом в сервисах вызывать $em = $this->ems->get($tenantId). В итоге в проекте будут и стандартные $em и $connection для работы с общей базой пользователей для аутентификации, и отдельные пользовательские $ems->get($tId) и $conns->get($tId).
Anonymous
Привет ребят. Помогите новичку в симфе. пытаюсь рекорировать интерфейс interface Repository{} class FileRepository implements Repository {} class CachedRepository implements Repository {__construct(Repository $repository) {} } в конфиге пробовал так - Repository: '@FileRepository' - CachedRepository: decorates: Repository пробовал так - Repository: '@FileRepository' - CachedRepository: decorates: FileRepository но что то не заводится... чяднт?
Anonymous
Anonymous
Во-вторых, это весьма странный репозиторий, если ему нужен мэйлер )
не обращайте внимания - это высосан из пальца пример
Anonymous
Во-первых, декоратор оборачивает оригинальный объект: class CachedRepository {__construct(Repository $repo)
не совсем корректный пример привел - поправил добавил реализацию интерфейса
Anonymous
А что не работает?
неа. во всех примерах что находил используются конкретные реализации интерфейса в конфиге, при это сам интерфейс не участвует. ожидал что будет работать что то типа такого # services.yml - RepositoryInterface: '@FileRepository' # services_prod.yml - CachedRepositoryDecorator: decorates: FileRepository и через di уже запрашивать интерфейс, а получать декоратор с прокинутой реализацией но то ли руки кривые то ли доку не дочитал... ну не может же быть что все всегда прокидвают конкретные реализации?
Andrei
Коллеги, такой вопросик. Есть набор классов (служб), с единым интерфейсом. Хочу сделать фабрику, которая в зависимости от переданного параметра возвращает одну из этих служб. Но есть момент - каждая служба в конструктор инжектит свой набор зависимостей. Как по-феншую организовать такую фабрику? Я как понимаю передавать контейнер в нее - не лучшая практика. (или нет?) Впрочем как и передать ей в конструктор все связанные службы которые она должна отдавать?
Andrei
Передай в фабрику уже готовые службы 😂
Боюсь это хуже чем передать туда контейнер =)
Andrey
а, мне показалось, что второй вариант - это все зависимости служб передавать, чтобы службы создавать, тогда мой вариант: зависимости вместо самих служб 😈 на самом деле, если все будет скрыто, то не так уж и важно что и как внутри будет
Andrei
а, мне показалось, что второй вариант - это все зависимости служб передавать, чтобы службы создавать, тогда мой вариант: зависимости вместо самих служб 😈 на самом деле, если все будет скрыто, то не так уж и важно что и как внутри будет
тут есть момент, что как не передавай все службы или все зависимости, контейнер проинициализирует их тогда, для передачи в фабрику. А они может и нафиг не нужны в этот момент
Andrey
ну как они внутри контейнера находятся ты тоже не знаешь то ли создаются по запросу, то ли уже созданы, а может там прокси по факту и ты зря пытаешься это оптимизировать но вообще я просто еще один вариант для разнообразия подбросил )
Andrei
ну как они внутри контейнера находятся ты тоже не знаешь то ли создаются по запросу, то ли уже созданы, а может там прокси по факту и ты зря пытаешься это оптимизировать но вообще я просто еще один вариант для разнообразия подбросил )
Спасибо за вариант. Правда мне все-же кажется передать контейнер наименьшее зло. Удивляюсь что никто с этим не сталкивался, ведь задача то типичная. Есть какой-то параметр, и в зависимости от него надо выдернуть ту или иную службу, которая сделает хорошо)
Andrey
Спасибо за вариант. Правда мне все-же кажется передать контейнер наименьшее зло. Удивляюсь что никто с этим не сталкивался, ведь задача то типичная. Есть какой-то параметр, и в зависимости от него надо выдернуть ту или иную службу, которая сделает хорошо)
"наименьшее" - это смотря с какой стороны посмотреть как по мне, так инъекция напрямую наименьшая, потому как нет зависимости от контейнера тем более в симфони можно тегать интерфейс и прокинуть этот тег в сервис - автоматом подтягиваться будут новые службы а в фабрике потом у служб и спрашиваешь подходят ли им параметры или нет т.е. че-то типа: foreach ($handlers as $handler) { if ($handler->accept($request) { return $handler; } } throw new \Exception('not found');
Andrey
https://symfony.com/doc/current/service_container/tags.html#autoconfiguring-tags
Andrei
https://symfony.com/doc/current/service_container/tags.html#autoconfiguring-tags
спасибо, с тегами интересно. Буду изучать. Главное придумать как избежать инициализации всех заюзаных в фабрике служб. Их планируется много
Andrei
Вот еще нарыл вариантик:
Andrei
https://medium.com/developer-space/strategy-design-pattern-implementation-with-symfony2-1c9a25d43938
Andrei
CompillerPass какие-то юзать предлагают) Чую надо курить мануал взатяг )
Andrey
https://symfony.com/doc/current/service_container/tags.html#autoconfiguring-tags
так там же та же схема предлагается, что и у меня, просто ты ручками в фабрику забрасываешь реализации интерфейса чтобы ручками не кидать - теги и задействуют по моей ссылке из коммента ниже по тексту пример как оно автоматом в фабрику попадает: https://symfony.com/doc/current/service_container/tags.html#reference-tagged-services
Юра
Ну и еще почитай про https://symfony.com/doc/current/service_container/service_subscribers_locators.html
Andrei
Ага, спасибо!
Andrei
Ну и еще почитай про https://symfony.com/doc/current/service_container/service_subscribers_locators.html
посмотрел. но там сервис-локатор, что и есть, по сути передача контейнера в фабрику, или в данном случае, в обработчик
Alexey Mishurovskiy
посмотрел. но там сервис-локатор, что и есть, по сути передача контейнера в фабрику, или в данном случае, в обработчик
При передаче контейнера надо сервисы делать public. В случае с фабрикой не вижу ничего страшного что она будет Container Aware
Maks
Алексей Анатольевич
народ, давайте напишем exception в честь Нового Года и посвятим его программистам)))
Юра
SnowNotFoundException()
Дмитрий
DohuyaSnegaDetectedException()
Kirill
SilenceNotFoundException()
Trigger
HappyNewYearDetectedException();
Kirill
HappyNewYearDetectedException();
Тогда уж HappyNewYearNotFound()
Andrey
TooManyExceptionsFound
Алексей Анатольевич
Юра
UnrecoverableFatalErrorAbortException()
Алексей Анатольевич
pzdc, как datepicker изменить дату на лету? Кто нибудь сталкивался с проблемой изменить параметры Form на лету? Делаю setData(), а форме хоть бы хны
Алексей Анатольевич
я уже даже addEventListener повесил.. безрезультатно