Size: a a a

2021 January 16

S

SarcasmIO in phpGeeks
Всем привет, извиняюсь за нескромный вопрос. Ввиду отсутствия дженериков в PHP, не представляю, как можно реализовать следующее.

Мне с API приходит JSON. Парсю его, создаю DTO, и возвращаю в приложение объектом.
Если приходят одиночные объекты, проблем никаких нет. Но если приходят массивы (так же 2-х или 3-х уровневые), хочу их все конвертировать в отдельные объекты. Не понимаю, как правильно реализовывать такое. Пробовал через ArrayObject, либо отображается криво, либо вложенные массивы, которые также должны быть преобразованы в объекты, не проходят. Гуглил, но информации крайне мало. Как это можно сделать максимально правильно? Заранее спасибо за помощь. Код и пример JSON-файла залил на Gist:

https://gist.github.com/MyZik/14f36f798c206a364f8552d0357de8c2
возьми сериалайзер и через phpdocextractor опиши структуру вида DTO[] он сам разберет
источник

S

SarcasmIO in phpGeeks
new Serializer\Serializer([
               new Serializer\Normalizer\DateTimeNormalizer(
                   'c',
                   new \DateTimeZone('UTC')
               ),
               new Serializer\Normalizer\ArrayDenormalizer(),
               new PropertyNormalizerWrapper(
                   null,
                   new PropertyNameConverter(),
                   new PhpDocExtractor()
               ),
               new EmptyDataDenormalizer(),
               new EmptyDataNormalizer()
           ]
       );

на ура соберет тебе по пропертям в пхпдоке  объектом твои

    /**
    * @var TxList[]
    */
источник

СМ

Сергей Моисеев... in phpGeeks
Всем привет, извиняюсь за нескромный вопрос. Ввиду отсутствия дженериков в PHP, не представляю, как можно реализовать следующее.

Мне с API приходит JSON. Парсю его, создаю DTO, и возвращаю в приложение объектом.
Если приходят одиночные объекты, проблем никаких нет. Но если приходят массивы (так же 2-х или 3-х уровневые), хочу их все конвертировать в отдельные объекты. Не понимаю, как правильно реализовывать такое. Пробовал через ArrayObject, либо отображается криво, либо вложенные массивы, которые также должны быть преобразованы в объекты, не проходят. Гуглил, но информации крайне мало. Как это можно сделать максимально правильно? Заранее спасибо за помощь. Код и пример JSON-файла залил на Gist:

https://gist.github.com/MyZik/14f36f798c206a364f8552d0357de8c2
А тип объекта какой должен быть, stdClass?
источник

in phpGeeks
SarcasmIO
new Serializer\Serializer([
               new Serializer\Normalizer\DateTimeNormalizer(
                   'c',
                   new \DateTimeZone('UTC')
               ),
               new Serializer\Normalizer\ArrayDenormalizer(),
               new PropertyNormalizerWrapper(
                   null,
                   new PropertyNameConverter(),
                   new PhpDocExtractor()
               ),
               new EmptyDataDenormalizer(),
               new EmptyDataNormalizer()
           ]
       );

на ура соберет тебе по пропертям в пхпдоке  объектом твои

    /**
    * @var TxList[]
    */
Да, это тоже как вариант. Изначально хотел так и делать, но я пишу пакет для Composer который будет в свободном доступе на Github, поэтому не знаю, будет ли правильным решением подключать ещё и Serializer туда, и можно ли сделать короче и симпатичнее :)

Но у меня сейчас чувство, что это единственное нормальное решение...
источник

in phpGeeks
Сергей Моисеев
А тип объекта какой должен быть, stdClass?
Да
источник

СМ

Сергей Моисеев... in phpGeeks
Да
Есть неправильный способ: json_decode(json_encode($array))
источник

S

SarcasmIO in phpGeeks
Да, это тоже как вариант. Изначально хотел так и делать, но я пишу пакет для Composer который будет в свободном доступе на Github, поэтому не знаю, будет ли правильным решением подключать ещё и Serializer туда, и можно ли сделать короче и симпатичнее :)

Но у меня сейчас чувство, что это единственное нормальное решение...
а что не так с сериалайзером в пакете ?
ты собираешь его руками, либо если у тебя есть DI и конфиги то делаешь что то вроде

- "@=container.has('serializer') ? service('serializer') : service('custom.serializer')"
источник

S

SarcasmIO in phpGeeks
тогда челы дальше смогут юзать твой standalone пакет с
источник

S

SarcasmIO in phpGeeks
вот этой штукой в твоем коде
источник

S

SarcasmIO in phpGeeks
SarcasmIO
new Serializer\Serializer([
               new Serializer\Normalizer\DateTimeNormalizer(
                   'c',
                   new \DateTimeZone('UTC')
               ),
               new Serializer\Normalizer\ArrayDenormalizer(),
               new PropertyNormalizerWrapper(
                   null,
                   new PropertyNameConverter(),
                   new PhpDocExtractor()
               ),
               new EmptyDataDenormalizer(),
               new EmptyDataNormalizer()
           ]
       );

на ура соберет тебе по пропертям в пхпдоке  объектом твои

    /**
    * @var TxList[]
    */
технически этого даже не надо делать руками если у тебя serializer-pack в зависимостях
источник

in phpGeeks
SarcasmIO
технически этого даже не надо делать руками если у тебя serializer-pack в зависимостях
Хорошо, тогда я так и сделаю, спасибо большое! :)
источник

Н

Никита in phpGeeks
Привет. Подскажите уместно ли применить паттерн «Строитель» и «Наблюдатель» вместе? Есть класс с базовой функциональностью, но его надо расширить, вызывая после него ещё несколько других методов. Чтобы избежать связанности хочу применить «Наблюдатель», сделать что-то типа:
$concreteClass = new ConcreteClass();
$concreteClass->attach(Method1);
$concreteClass->attach(Method2);
$concreteClass->attach(Method3);
$concreteClass->execute();


И для того чтобы в клиентском коде не писать гору аттачей, хочу применить «Строитель», который по методу baseConcrete() будет возвращать экземпляр ConcreteClsas вместе со всеми базовыми аттачами

$concreteClass = ConcreteClassBuilder::buildBase();
$concreteClass->execute();
источник

V

Victooor in phpGeeks
Сергей Моисеев
Есть неправильный способ: json_decode(json_encode($array))
Вы приняты в команду
источник

E

EpicFail in phpGeeks
Всем привет, кто может помочь? Мне нужно вывести все так сказать (лагеря) в диапазоне этих дат и соответственно средний рейтинг по ним но у меня выводит только 1 лагерь и к нему средний рейтинг ко всем
источник

E

EpicFail in phpGeeks
SELECT camps.names, campsrating.datas, AVG(rating)
            FROM campsrating
            INNER JOIN camps ON camps.id = campsrating.camp_id
            WHERE datas BETWEEN '2020-01-01' AND '2020-12-31'";
источник

АД

Александр Дементьев... in phpGeeks
Сергей Моисеев
Есть неправильный способ: json_decode(json_encode($array))
я так делаю иногда. В смысле неправильно? 😱 Работает, значит правильно 😏
источник

АД

Александр Дементьев... in phpGeeks
EpicFail
SELECT camps.names, campsrating.datas, AVG(rating)
            FROM campsrating
            INNER JOIN camps ON camps.id = campsrating.camp_id
            WHERE datas BETWEEN '2020-01-01' AND '2020-12-31'";
WHERE datas >= '2020-01-01' AND datas <= '2020-12-31'";`
Так ?
А вместо Inner join, тут уместнее LEFT OUTER JOIN
источник

E

EpicFail in phpGeeks
всеравно выводит только 1 лагерь а у меня там 4 за етот год должно быть
источник

АД

Александр Дементьев... in phpGeeks
да?
источник

E

EpicFail in phpGeeks
не работает
источник