fink3L
Вообще да, странно, у меня же 2 сервиса будет, с одним формтайпом, но разными зависимостями. Действительно, как понять какой сервис мне нужен, если тупо по названию класса форму создавать.
fink3L
ладно, сейчас буду дальше разбираться
Alexey
Там второй параметр одним из допустимых значений подразумевает строку. Я подозреваю, что туда не только имя класса можно передать, но и имя сервиса. Попробуй проверить.
fink3L
fink3L
Alexey
Вопрос по бестпрактисам есть.
Я вот тут рефакторю один старый код и хочу убрать из зависимостей сервисов EntityManager там, где он действительно не нужен и заменить большую часть таких зависимостей репозиториями определёнными как сервисы.
Вопрос вот в чём: там, где хотелось бы, всё же, делать persist() (не flush()) сущностей в сервисе - можно ли обойтись без инжекта менеджера тоже и как вообще в таких случаях поступают по-хорошему?
Sergey
> как вообще в таких случаях поступают по-хорошему?
выносят персист в репозиторий
Alexey
То есть, это нормальная практика? Я об этом думал, но сомневался.
Sergey
нуууу а где по твоему надо делат персист?
Sergey
или давай так.... в каких ситуациях надо делать персист?)
Alexey
Нет, ну логично. Просто я подумал, что если его там нет из коробки - может быть на это причина.
Sergey
Вот тебе мои бест практис относительно этого вопроса:
- репозитории не наследуются ни от кого. Это часть твоей модели предметной области и в идеале у них должен быть тоько метод add (где собственно можно делать персист)
Sergey
- EntityRepository можно юзать только внутри твоего репозитория.
Sergey
- EntitManager стоит юзать только внутри твоего репозитория
Sergey
если тебе нужно сделать вбыорки - делаем сервис-обертку над entity manager-ом который предоставляет лишь часть функционала
Sergey
(тип сегрегация интерфейсов и все такое)
Alexey
Угу. Хорошо. Это довольно схоже с тем, о чём я думал, но сомневался. Спасибо.
Sergey
flush в контроллерах
Alexey
Ну, про flush() понятно.
Sergey
никаких save в репозиториях
Sergey
вроде бы все
Alexey
Под save() подразумевается обёртка на persist() и flush()?
Sergey
все что используется не для добавления
Sergey
flush дергать где-то внутри вообще грешно
Sergey
так как "внутри" нет понятия о границах бизнес-транзкции
Alexey
Это да.
Alexey
Я уже на это успел в своё время напороться и убрал отовсюду flush().
Sergey
а persist нужен только для добавления сущности в UoW так что... в методе add
Alexey
Надо сказать, когда я первый раз увидел Symfony - куда я только этих флашей не напихал. Когда рефакторил - аж самому смешно и противно было.
Sergey
))
Sergey
все так делали)
Alexey
И, собственно, натолкнулся на это дерьмо, когда начал разбираться, схера ли у меня одна простая вещь генерит столько запросов в БД. Это уже не говоря о том, что там никакой нормальной цельной транзакции не было... Страшно вспоминать.
Alexey
@fes0r В общем, спасибо.
Danil
Всем доброе утро.
Завелся спор, скажите, прав ли я и поправьте если нет:
1)Модели в СФ - это абстрактное представление данных для организации общей структуры, которую можно использовать на уровне Doctrine? Причем только на уровне Доктрины.
2)Всякие ClassManager-ы, которые как правило могут инициализироваться как сервисы и используются в контроллерах, нужны лишь для организации какой-то кастомной логики создания определенного объекта. Типа UserManager - имеет метод createUser(), который хэширует в себе свойство plainPassword, которое на уровне Doctrine никуда в транзакции не попадает дальше представления.
🐴
🐴
Т.е. вообще говоря модель не подразумевает какой-либо связи с доктриной или любой другой ОРМ
Дмитрий
Всем привет.
Есть контроллер, добавлен в services
services:
date_service:
class: AppBundle\Controller\DateController
в DefaultController пытаюсь к нему обратиться и получаю You have requested a non-existent service "date_service".
$Date = $this->get('date_service');
что не так делаю?
Danil
Интересно, а зачем обарачивать контроллер в сервис, чтобы потом его юзать в другом контроллере?
Danil
Все что угодно может быть не так
например не подрубается yml файл, в котором ты определяешь сервис
Danil
В основном файле конфигурации
Дмитрий
синхронизация не прошла, на сервере файл не обновился
Danil
А почему это в контроллере?
Alexey
Danil
BundleName/Util/Week.php
Danil
Дыа, если зависимостей нет, то это тупо хелпер
Дмитрий
хм
Danil
Какой смысл вообще был это в контроллер пихать!?
Дмитрий
учимся :)
Danil
А тут в темку вопрос будет
Не раз видел, как в контроллере создается приватный метод, который создает какую-то кастомную форму
Это разве норма? И в оф. доках такие вещи есть вроде
Danil
И в контроллере типа вызывается
$this->createForm($this->getUserFilterForm(), $this->getUser())
Alexey
Создание кастомных форм лучше делать в классе формы. Это можно видеть в symfony best practices.
А в доках это для повышения читаемости и упрощения показано, скорее всего.
Danil
А многие этого не понимают
Danil
В принципе для читаемости проще эти же действия производить в методе контроллера >.<
Danil
Ща вспомнил, что какую-то вещь тут скидывали, где какая-то "методология" разработки применяется, где экшен контроллера - это отдельный класс, там как-то слишком умно называется, я не помню
Можете кто нибудь подкинуть?
Danil
Т.е. на каждый запрос - отдельный класс
Danil
Вроде как
Danil
Ой, сколько у меня тавтологии...
Alexey
Да скорее всего как-нибудь и называется типа Action Class.
Danil
Не, там именно философия какая-то
Alexey
Ну, то есть с Платоном и афинянами?
Danil
Я даж где-то читал, натыкался, что контроллером правильно называть метод класса, то бишь экшен
Danil
А не сам класс
Дмитрий
подскажите как настроить подключение к двум базам на разных серверах
Alexey
Документация же, не?
https://symfony.com/doc/current/doctrine/multiple_entity_managers.html
Дмитрий
пропустил этот раздел :( спасибо
Alexey
Ну, если что, гугл спасает. Я туда написал "Symfony Doctrine multiple databases" и оно на первой строчке было :)
Alexey
Опыт показывает, что если начать гуглить на английском, релевентность результатов вырастает в разы.
fink3L
Как думаете? есть ли смысл морочиться с разными методами в репозитории для разных степеней "заполненности" объекта?)
Все тот же пример из моего блога, с авторами, их постами и заметками.
В репозитории автора у меня есть метод getQuery, который собирает запрос с двумя джоинами, репозиторий авторов использует этот запрос для получения списка авторов и на выходе у меня сразу авторы с постами и заметками, без всяких ленивых загрузок. Но, наверно, мне не всегда будут нужны и посты и заметки.
Это вообще проблема или я перезаморочился?)
Alexey
Я думаю, что правильнее делать не методы, которые выбирают сущности с разной степенью гидрации коллекций, а целевые конкретные методы. Например, нужно получить пост с комментариям - делается метод "получить пост с комментариями". Ну, то есть, тут как с бесполезными сеттерами в сущности, пожалуй. Мне кажется, должны быть отдельные методы решающие свою задачу.
Anonymous
Я тоже делаю так, как сказал комрад выше.
Anonymous
Вроде нормально выглядит (на мой вкус и моё ИМХО).
fink3L
Alexey
Да, наверное. Только тут надо аккуратнее с семантикой. В том числе помнить, что такое find, а что такое get.
Ну и в целом да, получатся методы с разной степенью гидрации, но главное, как мне кажется, отталкиваться не от проблематики, а не от того, что "просто хочу несколько методов чтобы по-разному коллекции наполняли".
fink3L
Alexey
Кстати, по поводу работы с сущностями, доктрины и всего такого, у Окрамиуса есть хороший доклад, который я бы мог советовать послушать.
https://www.youtube.com/watch?v=rzGeNYC3oz0
Его тут, скорее всего, уже кидали, но он от этого хуже не становится :)
Anonymous
Alexey
Я, в общем-то о таком и говорил. О контексте.
Хотя местами у меня тоже бывает getPostWithComments() когда это наиболее логично звучит в данной ситуации.
fink3L