@prophp7

Страница 549 из 1387
Андрей
20.08.2017
08:56:53
Апдейты при локах в БД приведут к pdo exception в приложении и к закрытию EntityManager.

Можно использовать filesystem read lock в качестве альтернативы

Sergey
20.08.2017
09:29:49
Всем привет, вопрос по доктрине: является ли инъекция EntityManager в сервисы плохой практикой? Он ведь по сути является глобальной точкой доступа ко всем сущностям в проекте. И где вы flush'ите изменения, в контроллере?
я стараюсь оставлять entity manager nолько в своих репозиториях. И да, flush в контроллере потому что это единственное место где можно определить границу бизнес транзакции

Google
Sergey
20.08.2017
09:30:41
ну либо ты этот самый save в том же контроллере делаешь

тогда как бы ок но в этом нет смысла

Roman
20.08.2017
09:34:34
Хорошая идея

Aleh
20.08.2017
09:35:05
Roman
20.08.2017
09:35:07
Почему?

Sergey
20.08.2017
09:35:20
у тебя если сущность ты достал и она уже крутится в unit of work (managed entity) то она уже там

это если ты не менял настройки конечно

Roman
20.08.2017
09:35:30
А если вы решите на натив перейти?

Sergey
20.08.2017
09:35:39
Roman
20.08.2017
09:35:45
Я знаю, что сущность уже в менеджере

Aleh
20.08.2017
09:35:48
Почему?
https://www.slideshare.net/mobile/Yaboomaster1/save-repository-from-save

Google
Sergey
20.08.2017
09:35:58
да и потом

Roman
20.08.2017
09:36:02
Спасибо, почитаю)

напишу свой unit of work
Действительно?)

Sergey
20.08.2017
09:36:18
да, это не сложно

Aleh
20.08.2017
09:36:22
напишу свой unit of work
Возьми готовый)

Эти 100 строк будеи просто впадлу писать

Sergey
20.08.2017
09:36:39
Возьми готовый)
я пробовал - не нашел. Это как менять доктрину на любую другую ORM с UoW

Roman
20.08.2017
09:36:57
Короче в репозиторий только метод add добавлять и все

Sergey
20.08.2017
09:37:02
да

у меня другой вопрос - у тебя реально были прицеденты когда ты отказывался от Doctrine?)=

Aleh
20.08.2017
09:37:28
И remove/find

Roman
20.08.2017
09:37:37
Ну просто может быть такая ситуация, где некоторые репозитории прийдется реализовать нативно, без доктрины. Для перфоманса

Не было)

Sergey
20.08.2017
09:37:47
remove только если надо, я сейчас придерживаюсь того что бы remove почти никогда небыло

Roman
20.08.2017
09:37:55
Я понимаю что это маловероятно, но для долгих проектов вероятно

Sergey
20.08.2017
09:38:23
тут если у тебя проект будет чувствителен к лэтенси

и именно на запись

Roman
20.08.2017
09:38:35
Ну да, согласен

Sergey
20.08.2017
09:38:38
это настолько маловероятно, что прям ух

Aleh
20.08.2017
09:38:52
remove только если надо, я сейчас придерживаюсь того что бы remove почти никогда небыло
Ну если агрегат представляет не конечный процесс, а конец идет из вне, да

Google
Sergey
20.08.2017
09:39:21
Ну если агрегат представляет не конечный процесс, а конец идет из вне, да
тут болььше вопрос в том что ты собрался удалять

Sergey
20.08.2017
09:39:51
не, я мол с точки зрения бизнеса, знаешь ли ты что тебе можно это дело удалять?

из моего опыта крайне редко надо именно удалять

Roman
20.08.2017
09:40:15
+

Sergey
20.08.2017
09:40:28
"архивация" и т.д. намного более распространенная вещь, ибо никогда не знаешь когда тебе пригодятся удаленные данные

Roman
20.08.2017
09:40:35
Ребята, хотел спросить, вы cascade=persist юзаете?

Sergey
20.08.2017
09:40:41
да, юзаем

причем активно

Aleh
20.08.2017
09:41:38
не, я мол с точки зрения бизнеса, знаешь ли ты что тебе можно это дело удалять?
Ну да, если жизненный цикл сущности не предпологает переход в конечное состояние, которое равносильно удалению

Sergey
20.08.2017
09:42:04
я хочу попробовать prooph

вот к слову вопрос на тему аргегатов и event sourcing

Sergey
20.08.2017
09:42:28
допустим у тебя есть сущность и тебе нужны комменты например

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

пересчет рэйтингов

Roman
20.08.2017
09:43:09
Глупый вопрос, но вы действительно Сергей Протько?)))

Sergey
20.08.2017
09:43:38
@mkusher короч хз как с es это делать... количество объектов может быть приличным. Или лучше не делать подобного таким образом?

Roman
20.08.2017
10:10:45
Google
Aleh
20.08.2017
10:10:59
Это что?)
http://getprooph.org/

Roman
20.08.2017
10:48:54
@fes0r @mkusher мне интересно вот ваше мнение: Проект на Ларавел, юзаю доктрину. Разделил на модули. Допустим, модуль User. Создал класс UserManager, который отвечает за создание, просмотр и редактирование пользователей. В него я инжектю репозиторий и через него достаю юзеров, создаю и так далее. Но мне кажется, что я не правильно делаю, так как после разговора выше, понял, что надо флашить уже в контроллере, а я это делаю в репозитории. Как вариант, инжектить и UserManager, и EntityManager в контроллер, и после того, как UserManager сделает все свои дела по созданию юзера и добавит его в репозиторий через add(), вызвать флаш. Был бы благодарен за ваши комментарии.

Aleh
20.08.2017
10:50:04
а зачем вам UserManager?

Roman
20.08.2017
10:52:32
Для создания объекта, редактирования и read-функций

Admin
ERROR: S client not available

Roman
20.08.2017
10:53:18
Под созданием и редактированием подразумеваю не только добавить в репо, но и сопутствующие поверки/валидация, связанные с бизнес-логикой

Может название не лучшее, но на данный момент вот так

dypa
20.08.2017
10:55:15
@fes0r @mkusher мне интересно вот ваше мнение: Проект на Ларавел, юзаю доктрину. Разделил на модули. Допустим, модуль User. Создал класс UserManager, который отвечает за создание, просмотр и редактирование пользователей. В него я инжектю репозиторий и через него достаю юзеров, создаю и так далее. Но мне кажется, что я не правильно делаю, так как после разговора выше, понял, что надо флашить уже в контроллере, а я это делаю в репозитории. Как вариант, инжектить и UserManager, и EntityManager в контроллер, и после того, как UserManager сделает все свои дела по созданию юзера и добавит его в репозиторий через add(), вызвать флаш. Был бы благодарен за ваши комментарии.
похоже дело в то, что ты пытаешься использовать data mapper как active record у тебя может быть ситуация ты например создаешь пользователя и партнерский купон для этого пользователя. сохранение данных в субд будет происходить единовременно для пользователя и купона в рамках одной транзакции если flush будет в теле метода контроллера

репозитории стоит использовать для сложной логики получения или обработки данных которые находятся в СУБД

Roman
20.08.2017
11:00:04
dypa да, за флаш я понял уже, его в контролёре запускать)

а почему это не в User?
Ты имеешь в виду User::create(someData)?

dypa
20.08.2017
11:00:54
кто вас научил писать "за"?!

Aleh
20.08.2017
11:01:08
ну вообще да

Roman
20.08.2017
11:05:02
dypa
20.08.2017
11:05:50
вот и я не понимаю откуда в русском языке взялось "за"

Roman
20.08.2017
11:06:48
Косяки обучения :/

ну вообще да
А в данном случае User - это как своего сервис получается? Или модель, так сказать?

Aleh
20.08.2017
11:09:11
А в данном случае User - это как своего сервис получается? Или модель, так сказать?
это сущность, в терминах доктрины и почти в терминах ddd

Google
Roman
20.08.2017
11:13:28
@mkusher Угу, я понял вас. То есть создание и редактирование мы инкапсулируем в сущность User, в контроллер инжектим репозиторий и созданную сущность добавляем через репо. Причина, по которой я сделал менеджера, это из-за готовых контролеров админки, хотел облегчить высокую вероятность перехода на другую админку

@mkusher можно ещё совет один, пожалуйста: валидацию данных, которые идут в сущность, например в User::register($data), лучше делать до того, как вызывается метод регистрации, то есть в контроллере или в request объекте, или в самой сущности держать правила валидации.

Roquie
20.08.2017
11:43:55
Ребят тут такая проблема нарисовалась, когда начал приводить всю систему в тестируемый вид. Подскажите, как можно выкрутиться, глаз уже замылен. Проект имеет несколько ролей и штук пять таблиц у которых есть user_id. В зависимости от того, какой юзер вошел надо либо ограничить выборку по всем таблицам только по этому юзеру, либо ограничить по списку пользователей ему доступных. Ладно уж, ограничение выборки можно пропихнуть в Criteria, но как быть с апдейтом и удалением: как добавить условия к апдейту (and where user_id = 1) и к удалению, чтобы юзер с лоу-левел правами не смог обновить запись которая ему не принадлежит (подменив её id)? Пока вижу только одно хреновое решение - для подобных репозиториев написать трейт, который будет ограничивать выборку в зависимости от роли. Но черт побери, подкоркой понимаю, что не должна там быть проверка на права доступа. Логика разбрасывается по всему проекту. Что делать, как быть, кому молиться? :)

Вот такая штука должна быть глобальна для всего проекта. https://gist.github.com/roquie/4b78e4bf11488bb09ec01701bb11bd51 Или это дичайший говнокод и надо как-то иначе решить эту проблему?

dypa
20.08.2017
12:11:45
в doctrine сделано так http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/filters.html

Roquie
20.08.2017
12:13:32
Я уже и так думаю выкинуть eloquent и переписать с доктриной это добро, останавливает только объем кода

Maksim (Ellrion)
20.08.2017
12:29:09
И чем по сути доктриновский фильтр отличается от ларовского глобалскоупа?

Roquie
20.08.2017
12:31:50
глобал скоуп лары не подойдет, потому что при ограничении выборки как у меня выше, будет зацикливание (было по крайней мере) для User модели, поэтому поверх Eloquent нахерачили слой репозиториев, со своим скоупингом.

Sergey
20.08.2017
12:55:30
фильтры там нужны для таких механизмов внутренних как наследование таблиц к примеру

Страница 549 из 1387