Михаил
#lest
У меня нет кернела, я только использую компонент console
#lest
Михаил
Ну только помни, через ехес у тебя 2 кернел тайма будет
#lest
2 процесса имеешь ввиду?
Nikolay
Есть ДТО, в которую десериализуются данные через атрибуты (jms serializer), сделал public readonly для св-в, но так как конструктора нет, то phpstan на эти readonly св-ва ругается
Есть несколько вариантов:
1. Заигнорить ошибки в конкретном случае
2. Убрать readonly и сделать приватные св-ва и геттеры
3. Оставить св-ва просто публичными без readonly
Что-то ни один из вариантов не нравится. Кто как делает?
Михаил
Nikolay
4) сделать их protected
Можно так, но тогда надо тоже геттеры делать. и protected это же больше ограничение при наследовании
Михаил
Nikolay
Kirill
Kirill
final readonly class UserRequestDTO
{
public function __construct(
#[SerializedName('name')]
public string $login,
public string $password,
) {}
}
Михаил
Просто не понятно как сериализатор будет работать
Kirill
и не иметь себе мозг
Kirill
нормально будет работать
Kirill
разве что там есть опция какая-то на проверку неинициализированных полей, ща
Nikolay
так добавь конструктор, проблем-то
Я бы так и сделал. Сейчас есть ограничение, что при десериализации из метадаты создается объект, вот такая хрень
public function construct(
DeserializationVisitorInterface $visitor,
ClassMetadata $metadata,
$data,
array $type,
DeserializationContext $context
): ?object {
$className = $metadata->name;
return new $className();
}
Kirill
На тебе:
final readonly class ValidateMissingPropertiesSubscriber implements EventSubscriberInterface
{
/**
* @return list<array<non-empty-string, non-empty-string>>
*/
public static function getSubscribedEvents(): array
{
return [
[
'event' => 'serializer.post_deserialize',
'method' => 'onPostDeserialize',
]
];
}
/**
* @api
*/
public function onPostDeserialize(ObjectEvent $event): void
{
$object = $event->getObject();
if (!\is_object($object)) {
return;
}
$reflection = new \ReflectionClass($object);
foreach ($reflection->getProperties() as $property) {
if ($property->isInitialized($object)) {
continue;
}
$context = $event->getContext();
$factory = $context->getMetadataFactory();
$message = \vsprintf('Missing required [%s] property', [
\implode('.', [
...$context->getCurrentPath(),
$this->getPropertyName($object, $factory, $property),
]),
]);
throw new UnprocessableEntityHttpException($message);
}
}
/**
* @return non-empty-string|null
*/
private function getPropertyName(
object $context,
MetadataFactoryInterface $factory,
\ReflectionProperty $property,
): ?string {
$class = $factory->getMetadataForClass($context::class);
if (!$class instanceof ClassMetadata) {
return null;
}
$metadata = $class->propertyMetadata[$property->name] ?? null;
/** @var non-empty-string */
return match (true) {
$metadata instanceof JMSPropertyMetadata => $metadata->serializedName ?? $metadata->name,
$metadata instanceof PropertyMetadata => $metadata->name,
default => $property->name,
};
}
}
Kirill
Kirill
удали нафиг
Nikolay
удали нафиг
Уже пробовал, все попадало, видимо какой-то костыль
Михаил
Nikolay
Проект не твой?
Рабочий, гляну потом может получится это убрать. Там скорее всего при десериализации вызывается конструктор, чтобы инициализировать некоторые поля дефолтными значениями, если убрать то через рефлексию будет объект создаваться
Kirill
в JMS опция есть
Kirill
jms_serializer:
default_value_property_reader_support: true
Kirill
наркоманы....
Юра
Юра
Точнее public readonly
Юра
Симфони сериал затор нормально в такой класс пихает значения
Михаил
Apxat
народ подскажите а как исключения перехватывать в симфони консоли ? Можно как-то глобально сделать ?
Михаил
Apxat
а как теперь тип исключения получить ?
Михаил
Apxat
Exception, DomainException и т.д.
Apxat
да понял
Apxat
просто в try catch понятное всплытие а тут надо будет подумать -)
Apxat
я то думал почему ошибки из консоли в сентри не уходят, а он вообще по другому работает -)
Михаил
Так it это вцелом про подумать. Но на самом деле вроде странное решение вешать это на листенеры.
Если обработка прям однотипная - то да. Но ты рискуешь отлавливать исключения по вообще всем командам
Apxat
да я хочу отправлять все критические exception в sentry
Apxat
и хочу это делать глобально
Михаил
Михаил
так оно само может это делать, там в настройках есть перехват исключений
Apxat
так он стоит, но почему то не хватает у консоли симфони
Михаил
https://docs.sentry.io/platforms/php/guides/symfony/configuration/symfony-options/
Apxat
у нас к сожалению не симфони, а только некоторые модули оттуда (
Apxat
кстати только понял что если исключение нигде не обрабатывается то sentry его перехыватывает, но если исключение обрабатывается то нет
Павел
Павел
Павел
Михаил
Павел
Михаил
проблема то просто не в этом
Apxat
Да вот как раз сейчас разгребаю это, логи и ошибки
Apxat
Там как обычно часть пишется в файл, часть в ментри, какие-то на почту
Михаил
а ещё сентри любит задваивать/затраивать исключения
Apxat
Я понял одно, мне не нравятся логи в файлах
Apxat
Сейчас делаю в мантикору
Михаил
вылетело одно исключение, а в сам сентри написалось 3 сообщения из разных контекстов
Павел
Сейчас делаю в мантикору
Ну вот опять же, в файл или в stdout - это локально.
Отправлять по сети - это сетевые накладки и возможные проблемы
Павел
Вроде как если по правильному (хотя все отсносительно), сначало куда то локально (докер лог, файл), а уже потом пушить по сетке батчами отдельными сервисами
Apxat
У нас мантикора локально поднята
Михаил
Павел
Михаил
А то у сентри есть неприятная особенность, она отправляет всё на шаге терминейт. Так вот если сентри не отвечает то воркеры конечно же обработают запрос, но после обработки будут висеть секунд 30 без дела и в итоге обработка запросов, очередей, журналов встанет
Михаил
Логировать можно в stderr и пусть инфра это всё забирает. В файл не стоит, особенно если stateless контейнеры.
Михаил
Павел
Павел
Т.е. переключился с стектрейса ошибок на логирование
Doctor
Приветствую.
При генерации миграций Доктрина создаёт всратые названия у констреинтов с foreign key, а-ля FK_ABC19359135666.
Мне это не нравится, и я переименовываю их во что-то более читабельное и понятное мне.
Однако при последующих запусках bin/console do:mi:diff Доктрина упорно переименовывает всё обратно. Например:
$this->addSql('ALTER TABLE shop DROP CONSTRAINT shop_player_id_fk');
$this->addSql('ALTER TABLE shop ADD CONSTRAINT FK_AC6A4CA299E6F5DF FOREIGN KEY (player_id) REFERENCES player (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
Есть какой-нибудь способ попросить Доктрину так не делать?
Doctor
Индексы добавляю пока по-старинке, через аннотации:
/**
* @ORM\Table(
* name="shop",
* indexes={
* @ORM\Index(name="shop_player_id_idx", columns={"player_id"}),
* }
* @ORM\Entity()
*/
class Shop implements VersionAwareInterface
UniqueIndex-ы добавляю так же при необходимости.
Однако не нашёл аналогично способа, чтобы задать название для FK
Михаил
Doctor