📅  最后修改于: 2023-12-03 15:35:13.272000             🧑  作者: Mango
在 Symfony 中,经常需要将实体对象转换为数组以便在应用程序中传递、序列化等操作。Symfony 提供了一个现成的组件 — Doctrine 使此过程变得容易。
在 Symfony 中,可以使用 ArrayHelper
帮助器类将实体转换为数组。 ArrayHelper
是一个抽象类,定义了四个方法用于将实体转换为数组:
toArray()
:将实体对象转换为一个关联数组、多维数组或忽略特定的属性(默认情况下,所有的属性都会被包含在数组中)。toFlatArray()
:将实体对象转换为一个平面数组或忽略特定的属性(默认情况下,所有的属性都会被包含在数组中)。fromArray()
:将一个数组值映射到实体对象的属性中。fromFlatArray()
:将一个平面数组值映射到实体对象的属性中。以下是代表实体对象的命名空间 Entity
类定义:
// src/Entity/Product.php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="App\Repository\ProductRepository")
*/
class Product
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*/
private $name;
/**
* @ORM\Column(type="integer")
*/
private $price;
// getter and setter methods...
}
下面是如何使用 ArrayHelper
类将实体转换为数组:
use App\Entity\Product;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\SerializerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
class ProductController extends AbstractController
{
/**
* @var SerializerInterface
*/
private $serializer;
public function __construct(SerializerInterface $serializer)
{
$this->serializer = $serializer;
}
/**
* @Route("/product/{id}", name="product_show")
*/
public function show(Product $product): JsonResponse
{
// 转换为数组
$productArray = $this->serializer->serialize($product, 'array');
// 返回 JSON 响应
return new JsonResponse($productArray);
}
}
Doctrine ObjectNormalizer 是 Symfony 序列化组件的一个扩展。它允许将实体对象转换成符合 JSON 标准的格式,因为如果只使用 Symfony 组件的普通 ArrayNormalizer,实体对象将只作为一个类型为 object(或 JSON 中的 {})的元素。
下面是在 Symfony 中将实体对象转换为数组的一般用法:
use App\Entity\Product;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\SerializerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
class ProductController extends AbstractController
{
/**
* @var SerializerInterface
*/
private $serializer;
public function __construct(SerializerInterface $serializer)
{
$this->serializer = $serializer;
}
/**
* @Route("/product/{id}", name="product_show")
*/
public function show(Product $product): JsonResponse
{
$normalizer = new ObjectNormalizer();
$normalizer->setCircularReferenceHandler(function ($object) {
return $object->getId();
});
$encoder = new JsonEncoder();
$serializer = new Serializer([$normalizer], [$encoder]);
$productArray = $serializer->normalize($product, null, ['groups' => 'product_show']);
return new JsonResponse($productArray);
}
}
注意,我们需要定义一个函数在处理循环引用时使用。在上面的例子中,我们将 getProductId()
方法定义为在处理循环引用时使用。
Symfony 提供多种方式将实体转换为数组以便在应用程序中使用。你可以选择使用 ArrayHelper
或 ObjectNormalizer,具体取决于你的要求和个人喜好。无论哪种方式,Symfony 让实体和数组之间的转换非常容易,使 Symfony 应用程序变得更加灵活。