Иван
тогда можно свой ресолвер заделать, который будет кидать исключение
Konstantin
рантайм-чекер типов чутка поможет тут не забыть про #[Security] над методом
Konstantin
тогда можно свой ресолвер заделать, который будет кидать исключение
у меня есть свой ресолвер, да. но до него управление не доходит. сначала надо отресолвить аргументы, потом уже секурити чекать, по крайней мере сейчас так. и я не до конца уверен, что можно (и нужно) менять местами эти лиснеры (секурити и controller.argument_value_resolver
Konstantin
к тому же, понять в аргументс ресолвере, нужен ли конкретно этому методу юзер, не так-то и просто
Иван
Konstantin
всё, понял твою идею. звучит жестковато, если честно
Konstantin
даже ресолвер для этого не нужен, просто какой-то лиснер, который раньше controller.arguments сработает и им проверить, есть ли сейчас авторизованный юзер и можно ли этот метод вызывать без юзера
Konstantin
я не до конца уверен, что до того как сработают все секурити-лиснеры, можно будет понять "авторизован ли щас кто-то"
Konstantin
скорее, быть может, надо покопаться в ту сторону, что юзер всегда может быть (то есть разрешена анонимная аутетентификация), но у него не будет ролей
Konstantin
грубо говоря, чтобы getUser() и прочее всегда возвращали инстанс UserInterface, пусть и без ролей
Konstantin
тогда секурити сломается
A
Konstantin
она, если видит что есть юзер, считает что ты залогинен
Konstantin
поэтому, если мы каким либо образом подсунем в контейнер сервис юзера, все сломается
Konstantin
но идея все равно хорошая, доберусь до компа - потыкаю. возможно и правда сработает
Елнур
Konstantin
их отключить пришлось
Konstantin
и руками проставлять #[Entity]/#[ParamConverter]
Konstantin
Елнур
Konstantin
не, пытаюсь понять почему
Konstantin
почему-то кто-то куда-то редиректит и это зацикливается в ERR_TOO_MANY_REDIRECTS
Елнур
Попробуйте не кидать access denied
Konstantin
а что кидать?
Елнур
Пока ничего, чтобы проверить причину. Если бесконечный редирект прекратится, значит из-за него
Елнур
Или просто Exception
Konstantin
да, мой эксепшн кидается, всё ок
Konstantin
https://cdn.weblab.pro/675dd.png
Елнур
Это класс зареган как фактори?
Konstantin
ага
Konstantin
App\Entity\User:
factory: ['@App\Service\UserProvider', getUser]
Konstantin
интересно, можно ли фактори-сервису нулл возвращать
Елнур
Нужно попробовать сделать фактори lazy
Konstantin
мысль, да
Konstantin
похоже что получилось
Konstantin
а кстати даже без лейзи
Konstantin
public function getUser(): ?User
{
return $this->tokenStorage->getToken()?->getUser();
}
Konstantin
вот такого фабричного метода хватило
Елнур
Konstantin
ну вот говорю, чтобы DI обмануть этого хватило и всё работает
Елнур
Нужно сделать lazy, и чтобы кидало access denied exception
Елнур
Елнур
И ещё чтобы всегда возвращал user, а не нулл
Konstantin
у меня есть экшны, которые могут быть доступны анонимнам
Konstantin
поэтому там тайпхинт ?User
Konstantin
но повторюсь, мне нужно было обмануть DI, сказав, что сервис User есть, это с вашей помощью удалось сделать, спасибо. а вот подстановкой реального юзера в этот экшн уже секурити занимается
Konstantin
поэтому всё завелось именно вот в таком виде
Елнур
👍
A
Подскажите, а это нормально, когда класс сущности превращается в портянку из мета-данных (аннотации или атрибуты) ?
В результате у одного свойства может быть 10-15 строк мета информации, связанные с доктриной, валидацией, социализацией и прочими ?
Иван
не очень, потому что бизнессущность торчит наружу
A
так на практике обычно и делают?
или лучше в конфигурации выносить?
A
Иван
то, как делают обычно не имеет отношения к тому, как следует делать
A
тогда, как следует?)
Иван
отдельные дто на чтение, которые сериализуются как есть
Иван
отдельные дто команд на обновления, на которых и вешают валидацию
Konstantin
я тоже всячески пытаюсь обойти эту проблему. хочу, во-первых, чтобы из сущности сеттеры не торчали, а во-вторых, чтобы действительно вместо портянки атрибутов были полезные методы
Konstantin
пока есть какие-то не особо оформившиеся идеи в трейт вынести
Konstantin
или что-то придумать с наследованием
A
с трейтами другие проблемы бывают.
с которыми уде столкнулся.
например при использовании трейтов TimestampableEntity
при необходимости добавить какую-то мета-информацию к ним для определенной сущности, приходится вытаскивать эти поля из трейта в сущность, чтобы переопределять
Konstantin
типа чтобы везде в бизнес-логике фигурировала сущность А, наследованная от А1 (в ней вся метадата доктрины-сериалайзера-валидации итд), а для админки есть третья сущность Б с сеттерами-геттерами на каждое поле
Иван
трейты не нужны, наследование должно быть строго по открытости закрытости и Лисковой, а не для архитектуры
Юра
Трейты не очень подходят
Юра
Будут проблемы с ними
Юра
Вообще странная проблема у тебя
Юра
Не нравится портянка, гу раскидай её везде
Юра
Будешь потом лазить по коду находить где что
Юра
Мне наоборот нравится когда все в одном месте. Видомо дело вкуса
Konstantin
так в том и дело, что нигде в коде не нужны метаданные доктрины. абсолютн, ты их пишешь один раз
Konstantin
потом во время всей остальной работы с кодом и сущностями, она тебе не нужна, чем дальше она будет - тем лучше
Юра
Пиши их в ямле
Konstantin
гуд пойнт
A
Правильно понимаю, что предлагаете сущности разбивать на слои?
Типа первый слой сущности - это слой описывающие ее с мета-данными доктрины.
Второй слой - сущность с валидаторами, стерилизаторами и т.д.
А третий - с бизнесовыми методами?
Konstantin
во время работы с сущностью вообще интерфейс нужен, если честно, а не реализация. тогда в реализации можно любую помойку держать, заглядывать туда ты особо не будешь, тк везде в коде будет виден интерфейс этой сущности. будет чуть больше писанины, но зато clean code
A
Юра
Пришел запрос, он мапится в сущность ДТО, на которую навешены валидации
Потом мапиш это в сущность доктрины, на которой только доктрин аннотации
Konstantin
почему один раз? а при миграциях?
ну это редко по сравнению с повседневным контактом с кодом. поля ты меняешь сильно реже, чем работаешь с методами этой сущности
Юра
Лично я так не делаю ибо не люблю лишние сущности создавать