
Sergey
24.10.2017
08:06:03
$user->getCommentsCount() в принципе

Urmat
24.10.2017
08:07:11

Andrew
24.10.2017
08:07:57

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

Google

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

$iD
24.10.2017
08:08:10
кастомный реп?

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 это вообще ппц

Urmat
24.10.2017
08:19:58

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

Urmat
24.10.2017
08:20:49

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

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

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

Roman
24.10.2017
08:55:02

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

Sergey
24.10.2017
08:56:03

Roman
24.10.2017
08:57:17

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

Sergey
24.10.2017
08:58:07

Алексей
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
Ивент после флаша

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

Алексей
24.10.2017
09:04:34

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
Ну ок