Михаил
Хочу матом
Михаил
Но блин это не так
Kirill
если их задача обработать запрос в определённом формате, то как бы тут очевидно
Kirill
а дальше оно делегирует в сервисы
Kirill
получает сакссесс/исключение и преобразует обратно
Kirill
да вот даже статья есть (первая ссыль в гугле) https://habr.com/ru/articles/718916/
Kirill
> Presentation Layer (слой представления) – здесь находится все, что отвечает за input/output (ввод/вывод), например, шаблоны, консольные команды, контроллеры.
Kirill
или вот https://habr.com/ru/articles/802617/ > Слой, который взаимодействует непосредственно с пользователем, называется презентационным. Он отвечает за представление информации и адаптируется под различные платформы, например, веб и мобильные приложения, без изменения бизнес-логики.
Kirill
а домну уже инфра предоставляет логику свою через интерфейсы поэтому и говорю, что UoWInterface - норм решение придумалось)
Михаил
ну или апп
Ну тогда не апп. Просто если обращаться к мишени мартина то у него (из наружи внутрь) инфра -> интерфейс адаптеры -> юзкейсы -> сущности Но, у него фреймворки на слое с инфрой, а контроллеры на слое с призентейшеном. Но у нас в симфе контроллер - часть фреймворка. Поток управления не позволяет назвать это чем то отдельным.
Kirill
Апп он тогда, когда принимает дто и возвращает дто)
Kirill
А за преобразования отвечает уже внешняя шляпа, вроде JMS
Kirill
Тогда у тебя один контроллер/роут на любые представления
Kirill
Ну ты ж понимаешь, что это всё такое себе. Семантикой можно вертеть как угодно
Kirill
Просто если избавиться от специфичной для представления логики, то контроллер уже не презентейшн получается
Михаил
Короче иди ты
Михаил
Спать
Павел
Поэтому разбиение на слои с жестокосткими границами добавляет больше обсуждения и споров чем реального профита)
Юра
Заметил большой минус использования $em->wrapInTransaction()
Юра
Шторм перестает видеть какие там исключения могут кинуться
Михаил
Ну вот
Михаил
Поэтому фп говно
Михаил
The Ant
Поэтому фп говно
Не, просто шторм говно 😄
Юра
Ну шторму нужно каким-то образом понять что внутри функции вызывается другая фция и пробросить исключения
Юра
Это слишком накладно думаю учитывая динамическую природу пхп
Юра
Скорее пхп сам по себе не очень в этом плане
Юра
Ну факт остаётся фактом, исключения неправильно подсвечиваются
Михаил
https://encore.dev/blog/queueing
Вадим
привет! подскажите пожалуйста Есть сущность с parent и children, есть поле sort_order, хочу по нему сортировать коллекцию. Доктрина сортирует корневые элементы но не сортирует внутри children. Если я сделаю сортировку элементов children пыхом в геттере сущности, это совсем плохо?
Вадим
#[GetCollection(order: ['sort_order' => 'ASC'])]
Юра
У тебя стоит OrderBy на children?
Вадим
У тебя стоит OrderBy на children?
блин, не увидел, сделал, заработало, всем спасибо!
Вадим
Чо за GetCollection?
Это апи платформное
Вадим
Операция чтения коллекции
Aleksandr
товарищи, тегайте плиз если видите этих горе бизнесменов)
Aleksandr
этих криптовалютчиков?
и остальных подобных
Alexey Mishurovskiy
Всем привет! вопрос. делаю persist вижу сущность в entityManager, далее пытаюсь по тем же параметрам вытащить эту же сущность, получаю null и соответвенно далее сущность создается и снова персистится. Есть ли возможность дернуть сущность обратно по параметрам из Unit of work?
Alexey Mishurovskiy
А сделать flush одной сущности нельзя.
Михаил
Нет, получить недавно созданную сущность можно только по id
Юра
Кто-то знает можно ли в серилазайре исключить какую-то группу?
Юра
Есть аттрибут Ignore но он работает всегда
Юра
А мне нужно чтобы в одном месте где я сериализую респонс, какие-то поля проигнорить
Юра
Не хочется явно выставлять всем полям группу
Dmitriy
Отдельная дто
Павел
Не хочется явно выставлять всем полям группу
В целом это неплохой кейс, так в апи платформе делается и вроде выглядит норм, а главное понятно что где и для чего product:list, product:detail, product:write (для денормализации). Какие то детали уже можно нормалайзером
Юра
Я уже накидал реализацию, попробую МР сделать
Юра
Добавить в контекст ignored_groups
Юра
И если у поля есть такая группа то игнор её
Денис
Вопрос не про симфони, а про ООП. можно ли в классе обьявлять метод, в котором подключается файл с массивом, а потом использовать этот метод внутри остальных, обращаясь по его ключу, например вот так использовать getUserOptions: public function getUserOptions(){ $options = require $_SERVER['DOCUMENT_ROOT'] . "/config/auth.php"; return $options; } public function attempt(string $username, string $password): bool{ $user = $this->db->first($this->getUserOptions()['table'], [ $this->getUserOptions()['username'] => $username ]); if(!$user) { return false; } if(!password_verify($password, $user[$this->getUserOptions()['password']])) { return false; } $this->session->set($this->getUserOptions()['session_field'], $user['id']); return true; }
Юра
Во-первых ты наверное можешь заменить на относительный путь используя константу DIR
Юра
Во-вторых лучше тогда в конструкторе это сделать один раз
Юра
А вообще это похоже на конфиг, который можно считать где-то отдельно от класса и передать массив в конструктор
Юра
Тогда класс не будет зависеть от файла что уже хорошо потому что как минимум тестировать будет проще
Виктор
Всем привет! Никак не могу разобраться со следующим аспектом отношений в Doctrine. У меня есть сущности Photo и Watermark: class Photo { ... #[ORM\ManyToOne(inversedBy: 'photos')] private ?Watermark $watermark = null; ... } class Watermark { ... #[ORM\OneToMany(targetEntity: Photo::class, mappedBy: 'watermark')] private Collection $photos; ... } Хочу, чтобы при удалении Watermark во всех Photo, с которыми она связана, значение $watermark становилось null. Понятно, что можно перед удалением Watermark пройтись по всем Photo из её photos и вручную проставить null. Но есть ли способ добиться этого штатными средствами Doctrine? В данный момент при удалении Watermark она остаётся у тех фото, у которых была. Соответственно, при попытке доступа к Photo получаю "Entity of type 'App\Entity\Watermark' for IDs id(11) was not found". Пробовал добавить #[ORM\JoinColumn(name: 'watermark_id', onDelete: 'SET NULL')] к $watermark в Photo, но это тоже не работает. Также пробовал добавить #[ORM\Column(nullable: true)] к $watermark в Photo, но тогда получаю Object of class 'App\Entity\Watermark' could not be converted to string. Не могу понять, что делаю не так. Подскажите, пожалуйста.
Павел
Всем привет! Никак не могу разобраться со следующим аспектом отношений в Doctrine. У меня есть сущности Photo и Watermark: class Photo { ... #[ORM\ManyToOne(inversedBy: 'photos')] private ?Watermark $watermark = null; ... } class Watermark { ... #[ORM\OneToMany(targetEntity: Photo::class, mappedBy: 'watermark')] private Collection $photos; ... } Хочу, чтобы при удалении Watermark во всех Photo, с которыми она связана, значение $watermark становилось null. Понятно, что можно перед удалением Watermark пройтись по всем Photo из её photos и вручную проставить null. Но есть ли способ добиться этого штатными средствами Doctrine? В данный момент при удалении Watermark она остаётся у тех фото, у которых была. Соответственно, при попытке доступа к Photo получаю "Entity of type 'App\Entity\Watermark' for IDs id(11) was not found". Пробовал добавить #[ORM\JoinColumn(name: 'watermark_id', onDelete: 'SET NULL')] к $watermark в Photo, но это тоже не работает. Также пробовал добавить #[ORM\Column(nullable: true)] к $watermark в Photo, но тогда получаю Object of class 'App\Entity\Watermark' could not be converted to string. Не могу понять, что делаю не так. Подскажите, пожалуйста.
#[ORM\JoinColumn(name: 'watermark_id', onDelete: 'SET NULL')] Это должно работать, но это работает через БД, т.е. надо сначало сгенерить миграцию и выполнить
kakoi-to-noob
Всем привет! Никак не могу разобраться со следующим аспектом отношений в Doctrine. У меня есть сущности Photo и Watermark: class Photo { ... #[ORM\ManyToOne(inversedBy: 'photos')] private ?Watermark $watermark = null; ... } class Watermark { ... #[ORM\OneToMany(targetEntity: Photo::class, mappedBy: 'watermark')] private Collection $photos; ... } Хочу, чтобы при удалении Watermark во всех Photo, с которыми она связана, значение $watermark становилось null. Понятно, что можно перед удалением Watermark пройтись по всем Photo из её photos и вручную проставить null. Но есть ли способ добиться этого штатными средствами Doctrine? В данный момент при удалении Watermark она остаётся у тех фото, у которых была. Соответственно, при попытке доступа к Photo получаю "Entity of type 'App\Entity\Watermark' for IDs id(11) was not found". Пробовал добавить #[ORM\JoinColumn(name: 'watermark_id', onDelete: 'SET NULL')] к $watermark в Photo, но это тоже не работает. Также пробовал добавить #[ORM\Column(nullable: true)] к $watermark в Photo, но тогда получаю Object of class 'App\Entity\Watermark' could not be converted to string. Не могу понять, что делаю не так. Подскажите, пожалуйста.
А как у тебя синхронизация с файловым хранищем будет происходить?
Виктор
Да, делаю миграцию. И после удаления Watermark в соответствующим ей Photo её id остаётся. У меня SQLite, но вроде там это должно работать.
Виктор
#[ORM\JoinColumn(name: 'watermark_id', onDelete: 'SET NULL')] Это должно работать, но это работает через БД, т.е. надо сначало сгенерить миграцию и выполнить
Вот так же должно быть, верно? class Photo { #[ORM\ManyToOne(inversedBy: 'photos')] #[ORM\JoinColumn(name: 'watermark_id', onDelete: 'SET NULL')] private ?Watermark $watermark = null; }
Павел
Написал вот так, сделал миграцию. После удаления Watermark в Photo её id остаётся.
Смотрите на схему БД , поидее если fk с констрейнтом, этим уже не доктрина занимается
Виктор
CREATE TABLE photo ( ... watermark_id INTEGER DEFAULT NULL ... CONSTRAINT FK_14B784186282BE5D FOREIGN KEY (watermark_id) REFERENCES watermark (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE );
Виктор
Ну вот FK есть, и ON DELETE SET NULL тоже есть.
Виктор
Нашёл информацию о том, что FK по умолчанию выключены в SQLite и нужно делать PRAGMA foreign_keys = ON. Попробую разобраться, где это делать, и проверю, заработает ли.
Виктор
Сделал вот такой lifecycle listener. Всё равно не работает. #[AsDoctrineListener(event: Events::preRemove)] class SearchIndexer { public function preRemove(EntityManagerInterface $em): void { $em ->createNativeQuery('PRAGMA foreign_keys = 1', new ResultSetMapping()) ->execute(); return; } }
Виктор
Каким образом можно посмотреть, что происходит при вызове $em->remove($watermark)? Какие запросы выполняются к БД?
kakoi-to-noob
а так либо профайлер, либо в логах