📜  symfony 将实体转换为数组 - PHP (1)

📅  最后修改于: 2023-12-03 15:35:13.272000             🧑  作者: Mango

Symfony 将实体转换为数组 - PHP

在 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);
    }
}
使用 ObjectNormalizer

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 应用程序变得更加灵活。