• Как в Symfony сконфигурировать serializer?

    first-programmer
    @first-programmer Автор вопроса
    BoShurik, честно говоря не особо понял как это должно помочь и чем отличается. Что в колбеке, что в кастомном нормализаторе будет выполняться один и тот же код

    return match ($object) {
                0 => StatusEnum::TRANSACTION_STATUS_SUCCESS,
                1 => StatusEnum::TRANSACTION_STATUS_IN_PROCESS,
                2 => StatusEnum::TRANSACTION_STATUS_FAIL,
                default => null,
            };


    Этот код что делает? Просто матчит, типа если в json пришло 0 то одно значение запихать в объект, если 1 то другое и так далее, верно? По сути что этот код выполнится тут, что в колбеке вообще не должно влиять. Или я чего-то не понимаю?

    Так или иначе я попробовал сделать. Связал через аннотации нормализатор с полем которое оно должен обрабатывать (кстати кроме аннотаций есть другой способ или я делаю верно?), запустил это дело и дамплю

    var_dump($this->serializer);
    
            return $this->serializer->deserialize(
    			$result,
    			ResponseSuccessPayment::class,
    			'json',
    			[
    				'groups' => 'status',
    				AbstractObjectNormalizer::DISABLE_TYPE_ENFORCEMENT => true
    			]
    		);


    <?php
    
    namespace App\Normalizers;
    
    use App\Enum\StatusEnum;
    use Symfony\Component\Serializer\Annotation\Groups;
    use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
    
    class StatusEnumNormalizer implements NormalizerInterface
    {
    	/**
    	 * @Groups({"status"})
    	 */
    	public function normalize($object, string $format = null, array $context = []): ?StatusEnum
    	{
    		var_dump(['object' => $object]);
    
    		return match ($object) {
    			0 => StatusEnum::TRANSACTION_STATUS_SUCCESS,
    			1 => StatusEnum::TRANSACTION_STATUS_IN_PROCESS,
    			2 => StatusEnum::TRANSACTION_STATUS_FAIL,
    			default => null,
    		};
    	}
    
    	public function supportsNormalization($data, string $format = null): bool
    	{
    		return $data instanceof StatusEnum;
    	}
    }


    В object выводит

    array(1) {
      'object' =>
      enum App\Enum\StatusEnum::TRANSACTION_STATUS_SUCCESS : int(31);


    Это просто значение по умолчанию у свойства класса ResponseSuccessPayment, которое я для теста установил. В общем я видимо вообще концепцию не так понимаю. Я думал тут в $object будут данные из json, которые я буду матчить на статусы и потом эти статусы возвращать и таким образом типа вот нормализация происходит - сматчил - вернул - записал в объект. А тут какая-то совсем другая кухня.

    Видимо тут нужно вообще не все эти нормализаторы использовать и стерилизаторы а просто создать какой-то класс Таппер и в ручную мапить. А так получается ерунда, если честно пока)
    Написано
  • Как в Symfony сконфигурировать serializer?

    first-programmer
    @first-programmer Автор вопроса
    BoShurik,

    Какую из? :) Покажите, что выдается если использовать стандартный сериалайзер?


    Вот эту

    1 is not a valid backing value for enum "App\Enum\StatusEnum
    /app/vendor/symfony/serializer/Exception/NotNormalizableValueException.php
    Написано
  • Как в Symfony сконфигурировать serializer?

    first-programmer
    @first-programmer Автор вопроса
    BoShurik, я наверно тогда не правильно понимаю суть того как это должно работать(

    Вот мой код

    return $this->serializer->deserialize(
    			$result,
    			ResponseSuccessPayment::class,
    			'json',
    			[
    				AbstractNormalizer::CALLBACKS => [
    					'status' => function ($status) {
    						return match ($status) {
    							0 => StatusEnum::TRANSACTION_STATUS_SUCCESS,
    							1 => StatusEnum::TRANSACTION_STATUS_IN_PROCESS,
    							2 => StatusEnum::TRANSACTION_STATUS_FAIL,
    							default => null,
    						};
    					}
    				],
    				AbstractObjectNormalizer::DISABLE_TYPE_ENFORCEMENT => true
    			]
    		);


    Я тут просто матчу значения статуса которые приходят в json со значениями из Enum, типа если 0, преобразуй в такой StatusEnum::TRANSACTION_STATUS_SUCCESS, если 1 то в другой Enum. Типа при чем тут поиск тут 1? Объясните если не лень, я наверно что-то не так понимаю.
    Написано
  • Как в Symfony сконфигурировать serializer?

    first-programmer
    @first-programmer Автор вопроса
    BoShurik,
    Ваш StatusEnum точно BackedEnum?


    вроде да, если я правильно понимаю значение термина

    <?php

    namespace App\Enum;

    enum StatusEnum: int
    {
    case TRANSACTION_STATUS_CREATE = 0;
    case TRANSACTION_STATUS_IN_PROCESS = 11;
    case TRANSACTION_STATUS_SUCCESS = 31;
    case TRANSACTION_STATUS_FAIL = 41;
    }

    Брехня


    Ну специально я не брешу, говорю что вижу, может где-то какой-то косяк, приложение то не новое, но вот так есть сейчас. И я пробовал разумеется изначально использовать стандартный сериализатор без всяких поправок. Зачем мне себе лишнюю работу придумывать. Он не работает, выдает ошибку, которую я привел тут в вопросе. Я стал гуглить и нашел такое решение. Оно сработало. Но только почему-то если создавать ручками в конструкторе.
    Написано
  • Как в Symfony сконфигурировать serializer?

    first-programmer
    @first-programmer Автор вопроса
    BoShurik, если добавить нормализатор, как я показал, то все прекрасно начинает работать. Но не через конфигурирование di контейнера. И вот не понятно пока в чем разница.
    Написано
  • Как в Symfony сконфигурировать serializer?

    first-programmer
    @first-programmer Автор вопроса
    BoShurik, по умолчанию этот сериалайзер не использует нормализатор BackedEnumNormalizer, так я и пришел к решению чтобы добавить этот нормализатор для работы с Enum. Это видно и по дампу класса, там в массиве нормализаторов его нет и по ошибке

    1 is not a valid backing value for enum "App\Enum\StatusEnum
    /app/vendor/symfony/serializer/Exception/NotNormalizableValueException.php


    Если погуглить, то как раз и натыкаешься на это решение на одном из тредов по обсуждению этой проблемы на официальном репозитории.
    Написано
  • Как в Symfony сконфигурировать serializer?

    first-programmer
    @first-programmer Автор вопроса
    BoShurik, в рамках фреймворка, конфигурирование через стандартный services.yaml, при этом пока тестировал код я его создал, как показал, прямо в конструкторе и он работает, а вот через конфиги если создаю, почему-то не работает, интересно еще то, что если дампить, то видно что все нормализаторы добавляются в массив нормализаторов класса сериализатора. То есть вроде все должно работать, но почему-то он выдает ошибку, как будто не добавлен нормализатор BackedEnumNormalizer. Точно такая же ошибка была, пока я его не добавил тут, пока еще тестировал код

    $normalizers = [
    			new BackedEnumNormalizer(),
    			new ObjectNormalizer(),
    			new ArrayDenormalizer(),
    		];
    
    		$this->serializer = new Serializer($normalizers, [new JsonEncoder()]);


    Это если что конструктор моего класса ApiService. Так вот работает, а все тоже самое через конфигурацию не работает. Не могу пока каких-то подсказок найти. Вроде все выглядит правильно.
    Написано
  • Какой роутер выбрать с wi-fi 6 и openvpn клиентом?

    first-programmer
    @first-programmer Автор вопроса
    Вот сейчас выбираю между кинетиками разными, tp-link archer 73ax 55ax и Asus tuf ax3000. Микротики не знаю, вроде там много всего, но в путешествиях не хочется париться, если что-то не так пойдет и искать решения по пол дня. Я до этого микромирами не пользовался. На работе, когда системным администратором давно работал, настраивал один раз.
    Написано
  • Какой роутер выбрать с wi-fi 6 и openvpn клиентом?

    first-programmer
    @first-programmer Автор вопроса
    Протокол openvpn, ipsec тоже в целом не помешает. Еще было бы удобно отделять трафик для некоторых игр или сайтов, чтобы он не шел по vpn. Вообще vpn я настраиваю на роутера, чтобы работать. из-за границы без проблем. На руотере, а не просто на компьютере через openvpn клиент, потому что так точно весь трафик идет через vpn, все сетевые соединения абсолютно и нет вероятности что забудешь включить или еще что-то такое. У меня сейчас просто есть отдельно роутер Asus, но там есть vpn, но нет wi-fi 6. При этом там еще слабый процессор и мало оперативной памяти из-за этого скорость очень небольшая, примерно 2.5 мегабита в секунду.

    Вот сейчас выбираю между кинетиками разными, tp-link archer 73ax 55ax и Asus tuf ax3000. Микротики не знаю, вроде там много всего, но в путешествиях не хочется париться, если что-то не так пойдет и искать решения по пол дня.
    Написано
  • Почему ethernet не заменят на type-c?

    first-programmer
    @first-programmer Автор вопроса
    Интересно, что у производителя этого роутера порт usb type-c не заявлен как порт вместо ethernet https://www.amazon.com/GL-iNet-GL-MV1000W-Wireless..., но по описанию в статье, что вы отправили он таки заменяет ethernet.
    Написано
  • Кто-нибудь может подсказать криптобиржу откуда легко выводить на американскую карту?

    first-programmer
    @first-programmer Автор вопроса
    Василий Банников, да, я вот сейчас написал ответ на свой же вопрос) Так и есть. Та еще помойка.
    Написано
  • Как хранятся индексы в postgresql и mysql?

    first-programmer
    @first-programmer Автор вопроса
    Владимир Коротенко, не понял ваш ответ)

    1. У вас странный подход) Плюнуть на все. Во первых индекс не есть просто индекс, он разный в разных рсубд и в разных движках, даже в рамках одно mysql он ведет себя по разному в myisam и innodb. Во вторых именно знание того как эти индексы себя ведут помогает грамотно их создавать. Одно дело индекс справочника, другое дело индекс на таблицу с полем с кучей разных значений. Каков будет его размер? Влезет он в оперативную память? Как настроить размер буфера для индексов? Все это надо знать и настраивать.

    2. Это понятно что можно настроить и что все по-разному.

    3. Не понятно что имеете ввиду. Что я настрою? Размер таблицы гигов 120. Что можно настроить чтобы регулировать размер индекса? Он какой есть такой и есть. Суть в том, что в 13 версии, судя по тому что читал, делали какие-то доработки, после чего объем занимаемый индексами уменьшился в полтора или два раза.

    4. Как нет, если есть? Читайте ответ на 1 пункт.

    5. Я тут для того и задал вопрос и написал четко, что жду ответов от людей, кто вот прямо разбирался в теме, смотрел исходники, файлы открывал индексов, читал, сравнивал и прочее. То есть смысл писать какую-то субъективщину основанную просто на том что вы читали другие статьи как и я? Понятно что кто-то одно читал, кто-то другое, а кто-то вообще не читал, но думает что знает все. Разные мнения, а я спросил в надежде что в сообществе найдётся задрот, который просто перелопатил систему и все знает как будто сам писал)
    Написано
  • Как хранятся индексы в postgresql и mysql?

    first-programmer
    @first-programmer Автор вопроса
    Melkij, да, это что и читал. Вопрос в том, как это влияет на таблицу в файле. Получается что в файле данные хранятся в отсортированном по индексу порядке? Кстати там чуть не так, как вы написали, там есть несколько если до создания автоматического индекса - если не задали первичный ключ и если еще нет подходящего под условие столбца для создания на нем автоматически кластерного индекса - то есть поля с уникальными значениями и без null.
    Написано
  • Что может содержать DTO?

    first-programmer
    @first-programmer Автор вопроса
    На счет передачи между двумя системами на разных языках, пока не встречал. То есть мы в любом случае имея объект DTO на php, не будем его передавать в сервис на go или java в таком виде, мы передадим json. Если вы об этом.

    Поэтому все что внутри dto будет использоваться только внутри этого сервиса для которого создавался объект.

    Я про другие языки сказать не могу, но валидация всегда была частью dto в php, по крайней мере до введения более или менее нормальной типизации свойств объекта. Сейчас да, у нас есть типизация и когда мы создаем dto мы указываем тип данных для каждого поля. А раньше как было? Раньше был базовый класс, от которого наследовались все dto, в этом базовом классе был метод, который через рефлексию парсил все данные из докблоков и на основе их делал валидацию полей. То есть это уже была логика в dto.

    Плюс dto по определению вроде не должен содержать бизнес логики, при этом маппинг и сериализация не являются бизнес логикой.

    До кучи еще вопрос - а что делать со вложенными дто? Вот допустим у вас есть json, в нем у вас идут вложение объекты. Вы хотите на его основе построить дто. Предлагаете вместо одного умного дто, который принимает этот json или уже массив и полностью на его основе строит готовый dto со вложенными объектами использовать отдельный маппер, где описывать простыню последовательных действий с циклами, переборами массивов, чтобы создавать вложенные дто или коллекции дто? Выглядит как-то избыточно и не очень. А какая выгода от таких действий?

    Я вот хочу объект на основе массива

    [
    a => a,
    b => [
    [c => c],
    [e => e],
    ],
    f => [
    [g => [h => h]],
    [i => [j => j]],
    ],

    ]

    И тому подобное. Если делать маппер, я должен писать там цикл перебирать эти данные, если там идет массив то перебирать и его, наполняя еще один dto на основе этих данных, так создавать коллекцию dto и потом ее присваивать первому dto как свойство. Или не едать ничего такого, а вместо вложенных dto хранить в первом в свойствах строки с json и каждый раз когда нужно преобразовывать в массив и опять маппить на другое dto.
    Написано
  • Можно ли использовать GraphQL для админки где нужно не только обновлять, выводить данные, но и выполнять какие-то действия?

    first-programmer
    @first-programmer Автор вопроса
    А подскажите тут есть какое-то средство для замены swagger? Я смотрел видео, где докладчик сначала говорит - это так круто для фронтов и для пользователей, не нужно тратить время на долгое описание документации через сваггер аннотации. А потом вообще не слова об этом кроме как про фронтов. Им-то понятно не нужно прям развернутого описания где просто вводишь данные в поля, они могут и потыкать в редакторе, поизучать вопрос. А вот партнерам такое не совсем подходит, им же нужен готовый интерфейс где четко видно форму с минимальным набором полей, типами данных и описанием.
  • Что значит single responsibility в контроллере?

    first-programmer
    @first-programmer Автор вопроса
    Тоже так думаю, поддержали мысль, спасибо.
  • Использовать ли геттеры в классе где объявлены приватные свойства?

    first-programmer
    @first-programmer Автор вопроса
    К сожалению не могу сейчас дать линк на описание. У меня это уложилось в голове после прочтения какой-то статьи на хабре. Сейчас не могу найти, но может найду поделюсь. Там типа проводили исследование, что повсеместное использование геттеров не плохо увеличивает потребление памяти в целом по проекту, но возможно это бредовая статья, так как я сам никогда не проверял, просто поверил расчетам что там давали. Спасибо за мнение)
  • Использовать ли геттеры в классе где объявлены приватные свойства?

    first-programmer
    @first-programmer Автор вопроса
    К сожалению не могу сейчас дать линк на описание. У меня это уложилось в голове после прочтения какой-то статьи на хабре. Сейчас не могу найти, но может найду поделюсь. Там типа проводили исследование, что повсеместное использование геттеров не плохо увеличивает потребление памяти в целом по проекту, но возможно это бредовая статья, так как я сам никогда не проверял, просто поверил расчетам что там давали. Спасибо за мнение)