@symfony_php

Страница 351 из 1418
Sergey
24.10.2017
08:06:03
$user->getCommentsCount() в принципе

Urmat
24.10.2017
08:07:11
то это кака и должно выноситься в отдельный Dao
А где хранить это DAO? <sarcasm>Можно конечнов контроллер</sarcasm>, но может есть более правильное решение?

Sergey
24.10.2017
08:08:05
вообще в рамках симфони не обязательно так загоняться и можно все в репосах хранить

Google
Sergey
24.10.2017
08:08:10
либо выносить в Query functions

$iD
24.10.2017
08:08:10
$user->getCommentsCount() в принципе
это всё конечно ок, но что если мне не нужны объекты? ну вот в том же случае репортов

кастомный реп?

Sergey
24.10.2017
08:08:32
мы о кастомных репах и говорим

Andrew
24.10.2017
08:11:11
можно все в репосах хранить, если там два-три метода. Если они разрастаются, то нужно загоняться иначе будет беда, рефакторить тяжело. phpstorm уже умеет резолвить правильно $em->getRepository(Foo::class)->findByCustomQuery ? Раньше была беда, помогали репы как сервисы

Sergey
24.10.2017
08:12:28
>$em->getRepository(Foo::class) не делай так плз

а magic finders это вообще ппц

Sergey
24.10.2017
08:20:31
Почему?
потому что это сервис локатор

Andrew
24.10.2017
08:21:01
сервис-локатор зло :)

Urmat
24.10.2017
08:21:41
А как тогда обратиться к репо?

Google
Urmat
24.10.2017
08:21:56
Ведь даже в оф доках так делают

Sergey
24.10.2017
08:21:57
иньекция через конструктор

регистрируешь репос как сервис и потом инжектишь через конструктор в сервисы и контроллеры

Urmat
24.10.2017
08:27:19
иньекция через конструктор
Хмм.. Буду знать, Спасибо. Но все же хотелось бы поподробнее узнать в чем может быть зло? Я всего год работаю с симфони, и пока каких-то проблем не было

Sergey
24.10.2017
08:34:08
Хмм.. Буду знать, Спасибо. Но все же хотелось бы поподробнее узнать в чем может быть зло? Я всего год работаю с симфони, и пока каких-то проблем не было
- почти везде entity manager есть, где он нужен и не нужен, даже если нужно всего 1 репос достать. а em предоставляет еще работу с транзакциями и персистом, оно тебе точно везде нужно? - в одном сервисе может доставаться 10 разных репосов и ты в принципе не заметишь что давным давно нарушил SRP и твой сервис раздулся до невменяемых размеров - ты используешь сервис локатор, который признан злом еще десяток лет назад. об этом много чтива есть - чтобы писать юнит тесты тебе нужны двойные стабы, стаб на ЕМ и стаб на репос, что не очень то и удобно и выразительно - автовайринг симфони не можешь юзать

Dmitriy
24.10.2017
08:40:17
https://www.tomasvotruba.cz/blog/2017/10/16/how-to-use-repository-with-doctrine-as-service-in-symfony/ это?

Sergey
24.10.2017
08:42:54
примерно да

можно manager registry пушить вообще, чтобы не было проблем с entity manager is closed

но у нас немного проще AppBundle\Repository\Users: factory: ["@doctrine.orm.entity_manager", getRepository] arguments: [AppBundle\Entity\User]

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

Daniel
24.10.2017
08:52:02
А такой момент. Репозиторий может прятать в себе flush, например?

А то вроде как репозиторий может уметь читать не только с базы данных с использованием доктрины, но и со стороннего api например, а писать в сторонний апи как?

Sergey
24.10.2017
08:52:32
да

Daniel
24.10.2017
08:52:34
Надо же как-то прятать flush и доктрину

Алексей
24.10.2017
08:52:35
нет

Daniel
24.10.2017
08:52:39
Ну еб

:(

Алексей
24.10.2017
08:53:00
хотяяяя

Ну спорная херня

по сути у тебя должен быть интервейс UserRepoInterface

Google
Алексей
24.10.2017
08:53:23
И реализации

для доктрины

для хуйпоймичо

А там внутри реализация

Я такдумаю

Roman
24.10.2017
08:53:58
Надо же как-то прятать flush и доктрину
если ты пишешь в сторонний апи, зачем тебе доктрина?) это уже реализация самой апи должна заниматься

Sergey
24.10.2017
08:54:28
если у тебя атомарная транзакция, то без проблем можешь делать и remove и save, во всех c#/java интерфейсах репозиториев такое есть вот только репос должен работать только со своей сущностью, поэтому в доктрине такого по-умолчанию в репосах нет, ибо генериков еще не подвезли) но если нужны сложные транзакции или когда обновлять нужно несколько обьектов, тогда уже без прямого использования em никак

Roman
24.10.2017
08:55:02
Надо же как-то прятать flush и доктрину
Ну, я флашу в контроллере после выполнения всех работ. Инжектю $em в контроллер.

Алексей
24.10.2017
08:55:49
> когда обновлять нужно несколько обьектов, тогда уже без прямого использования em никак У меня ощущение что это говно

Потому что у меня так и есть

Sergey
24.10.2017
08:56:03
Ну, я флашу в контроллере после выполнения всех работ. Инжектю $em в контроллер.
чем раньше закрыл транзакцию, тем лучше. вот например ты отправил уже эмейл юзеру, а транзакция еще не закрыта, и в контроллере оказывается что она не может быть закрыта и нужен откат

Roman
24.10.2017
08:57:17
чем раньше закрыл транзакцию, тем лучше. вот например ты отправил уже эмейл юзеру, а транзакция еще не закрыта, и в контроллере оказывается что она не может быть закрыта и нужен откат
Тогда будет получаться своего рода AR, если сразу сейвить все. Но я думаю что вы правы. В варианте с имейлом, можно подвязать ивент на постФлаш

Алексей
24.10.2017
08:57:50
у меня в репо-методе есть такая штука типа $parrent->isNew() тогда $parrent->addChild($child) иначе $child->save()

Алексей
24.10.2017
08:59:08
Roman
24.10.2017
08:59:28
Sergey
24.10.2017
08:59:40
http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#lifecycle-events

Алексей
24.10.2017
09:00:04
окей

тогда как сделать сохранение файла(аватарки)?

Нужно удостоверится что транзакция прошла

Google
Алексей
24.10.2017
09:00:37
и только тогда сделать $file->move()

Это делать в контроллере?

Или в репо?

Или в ивенте?

$iD
24.10.2017
09:01:03
в сервисе

Dmitriy
24.10.2017
09:01:19
Можно генерить событие

и его обрабатывать

Алексей
24.10.2017
09:01:28
Ну вот я так и сделал

Admin
ERROR: S client not available

Алексей
24.10.2017
09:01:43
Типа PostCreateEvent

Dmitriy
24.10.2017
09:01:43
обычно событие не доктировские хуки )

Sergey
24.10.2017
09:01:56
аплоад это 2 разных операции, ты сразу получаешь темповый файлик, потом перемещаешь его куда-либо, и только потом сохраняешь в базе линку на этот файл

Roman
24.10.2017
09:01:57
обычно событие не доктировские хуки )
и в самом событии делать флаш?)

Алексей
24.10.2017
09:02:06
нет

Roman
24.10.2017
09:02:33
обычно событие не доктировские хуки )
Допустим в случае обновления сущности, где персист я не делаю)

Алексей
24.10.2017
09:02:54
аплоад это 2 разных операции, ты сразу получаешь темповый файлик, потом перемещаешь его куда-либо, и только потом сохраняешь в базе линку на этот файл
Я сначала генерю имя файла. Потом все это сохраняю в базу. Если транзакция прошла -> тригерю ивент в который кладу эту сущность и в нем сохраняю файл

Ивент после флаша

Sergey
24.10.2017
09:04:09
а если кончилось место на диске, диск недоступен, проблема с сетью и другие катаклизмы, которые не дают сохранить файл, а у тебя уже сохранена линка на это имя?

Google
Алексей
24.10.2017
09:04:51
Да. Будет плохо

А чо тогда делать?

Sergey
24.10.2017
09:06:20
у нас терабайты картинок, и есть куча всяких чекеров которые проверяют консистентность базы и файловой системы. но мы изначально сохраняем файл куда-либо, а потом уже в базе создаем и меняем записи

иначе могут быть ситуации когда линка ведет на несуществующую картинку, или битую картинку

Алексей
24.10.2017
09:06:45
окей

а если транзакция не прошла?

Sergey
24.10.2017
09:06:54
плюс есть еще ресайзы, которые тоже должны быть готовы

Алексей
24.10.2017
09:06:55
Удалять файл?

Sergey
24.10.2017
09:07:17
файлы вычищаются отдельными скриптами, которые следят за консистентностью

Алексей
24.10.2017
09:07:24
Ну ресайзы у вас же не на лету

Sergey
24.10.2017
09:07:47
в том то и дело, что в базу транзакция пойдет далеко не сразу

Алексей
24.10.2017
09:07:59
Как вариант -> создавать в очередь таску на сохранение файла.

Sergey
24.10.2017
09:08:00
картинка предварительно проходит 4-5 этапа обработки

и последний этап это сохранение в базу его

Алексей
24.10.2017
09:08:12
Тобишь POST метод может тупить?

Ждать пока картинка сохранится

и если IO забито то все?

Sergey
24.10.2017
09:08:44
у нас немного другой кейс

Алексей
24.10.2017
09:08:49
Ну ок

Страница 351 из 1418