#php #symfony
Вопрос:
Поэтому в настоящее время у меня есть этот код:
//getting products
$productsFirst = $this->productRepository->findBy(
['weather' => $conditionFirst],
['price' => 'ASC'],
2
);
$productsSecond = $this->productRepository->findBy(
['weather' => $conditionSecond],
['price' => 'ASC'],
2
);
$productsThird = $this->productRepository->findBy(
['weather' => $conditionThird],
['price' => 'ASC'],
2
);
//serializing products
$normalizers = [
new ObjectNormalizer(),
];
$encoders = [
new JsonEncoder(),
];
$serializer = new Serializer($normalizers, $encoders);
$productsFirst = $serializer->serialize($productsFirst, format:'json',);
$productsSecond = $serializer->serialize($productsSecond, format:'json',);
$productsThird = $serializer->serialize($productsThird, format:'json',);
$arr = array(
$city => array(
"weather_forecast" => $conditionFirst,
"date" => $dateFirst,
"product" => $productsFirst
),
array(
"weather_forecast" => $conditionSecond,
"date" => $dateSecond,
"product" => $productsSecond
),
array(
"weather_forecast" => $conditionThird,
"date" => $dateThird,
"product" => $productsThird
)
);
return $arr = json_encode($arr, | JSON_PRETTY_PRINT);
И я получаю этот ответ json:
{
"London": {
"weather_forecast": "clear",
"date": "2021-06-08",
"product": "[{"id":903,"sku":"6456909228","name":"Abdul Bergstrom","price":0.45,"weather":"clear"},{"id":1074,"sku":"6540442971","name":"Gladys Kirlin","price":6.73,"weather":"clear"}]"
},
"0": {
"weather_forecast": "clear",
"date": "2021-06-09",
"product": "[{"id":903,"sku":"6456909228","name":"Abdul Bergstrom","price":0.45,"weather":"clear"},{"id":1074,"sku":"6540442971","name":"Gladys Kirlin","price":6.73,"weather":"clear"}]"
},
"1": {
"weather_forecast": "light-rain",
"date": "2021-06-10",
"product": "[{"id":1103,"sku":"8486705088","name":"Dr. Aniyah Stehr IV","price":1.62,"weather":"light-rain"},{"id":931,"sku":"3629804527","name":"Jean Kirlin","price":5.11,"weather":"light-rain"}]"
}
}
Но я хотел бы избавиться от идентификатора и погоды из json. Декодирование, а затем повторное кодирование кажется плохим способом сделать это. Могу ли я получить доступ к необходимым значениям перед их сериализацией в json? Я хотел бы получить что-то подобное:
{
"London": {
"weather_forecast": "clear",
"date": "2021-06-09",
"product": [
{
"name": "Dr. Aniyah Stehr IV",
"sku": "8486705088",
"price": "94.68"
},
{
"name": "Jean Kirlin",
"sku": "3629804527",
"price": "10.76"
}
},
"0": {
"weather_forecast": "clear",
"date": "2021-06-09",
"product": [
{
"name": "Dr. Aniyah Stehr IV",
"sku": "8486705088",
"price": "94.68"
},
{
"name": "Jean Kirlin",
"sku": "3629804527",
"price": "10.76"
}
Извините, если это глупый вопрос, я все еще разбираюсь в symfony.
Комментарии:
1. Вы дважды сериализуете некоторые из них. Не сериализуйте/не кодируйте ничего, пока вы не построите весь объект и не будете готовы вернуть его в вывод. Сериализация/кодирование конечного объекта в JSON (один раз!) должно быть последним действием перед выводом.
2. Ладно, понял. Я сериализовал продукты, потому что не смог передать их в массив. Он возвращал нулевые значения. Итак, как я могу получить ценность от продукта? Продукт выглядит следующим образом: pastebin.com/cmbhM7ju
3. Возвращенные нулевые значения, когда и как? Вам нужно было бы быть более конкретным
4. Я бы предположил, что если все свойства объекта являются частными, то в классе должны быть доступны функции, с помощью которых вы можете читать из него. Проверьте документацию / исходный код для этого класса
Ответ №1:
Вам не нужно будет сериализовывать массив объектов.
В своей сущности вы можете объявить
use JsonSerializable;
/**
* @Entity(repositoryClass="AppEntityMyEntity::class")
* @Table(name="user")
*/
class MyEntity implements JsonSerializable
{
/** @Column(length=50) */
private $name;
/** @Column(length=50) */
private $sku;
/** @Column(length=50) */
private $price;
public function jsonSerialize()
{
return array(
'name' => $this->name,
'sku'=> $this->sku,
'price'=> $this->price,
);
}
}
А затем вызовите свой код, вы можете напрямую вызвать json_encode для этих сущностей:
//getting products
$productsFirst = $this->productRepository->findBy(
['weather' => $conditionFirst],
['price' => 'ASC'],
2
);
$productsSecond = $this->productRepository->findBy(
['weather' => $conditionSecond],
['price' => 'ASC'],
2
);
$productsThird = $this->productRepository->findBy(
['weather' => $conditionThird],
['price' => 'ASC'],
2
);
$arr = array(
$city => array(
"weather_forecast" => $conditionFirst,
"date" => $dateFirst,
"product" => $productsFirst
),
array(
"weather_forecast" => $conditionSecond,
"date" => $dateSecond,
"product" => $productsSecond
),
array(
"weather_forecast" => $conditionThird,
"date" => $dateThird,
"product" => $productsThird
)
);
return $arr = json_encode($arr, | JSON_PRETTY_PRINT);