thiagocordeiro/laravel-serializer

1.0.14 2024-02-19 08:53 UTC

This package is auto-updated.

Last update: 2024-09-19 11:26:46 UTC


README

Laravel-serializer 将请求中的 JSON 主体序列化为值对象,并将值对象序列化为 JSON 响应。它为给定的对象创建工厂,并使用 thiagocordeiro/serializer 创建编码和解码器。

安装

只需要求包

composer require thiagocordeiro/laravel-serializer

设置

此包将自动注册其提供程序,查看 Laravel 包发现。但如果由于任何原因提供程序未注册,则可以在 config/app.php 文件中手动注册提供程序。

return [
    ...
    'providers' => [
        ...
        LaravelSerializer\Framework\Providers\RequestSerializationProvider::class,
        ...
    ]
]

只需添加提供程序,您就可以配置并将值对象注入到控制器中,但是,为了返回这些对象,您需要更改 Kernel.php 以使用自定义路由配置,这样 Laravel 就能够将配置的对象序列化为响应。

打开 App\Http\Kernel 并根据上面的片段添加一个 __constructor

use Illuminate\Contracts\Foundation\Application;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
use Illuminate\Routing\Router;
use LaravelSerializer\Framework\Routing\SerializerRouter;

class Kernel extends HttpKernel
{
    public function __construct(Application $app, Router $router)
    {
        parent::__construct($app, SerializerRouter::from($router));
    }

    ...
}

配置值对象

一旦提供程序已注册并且 Kernel 使用 SerializerRouter,您就需要配置您想要启用序列化的对象。

打开或创建配置文件 config/serializer.php 并添加以下片段中应序列化的所有对象

return [
    App\MyObject::class => [], //
];

用法

假设您有一个 App\Order 对象,并且您希望对其进行序列化

<?php

namespace App;

class Order
{
    private int $customerId;
    private Address $delivery;
    private DateTime $placedAt;

    /** @var Product[] */
    private array $products;

    public function __construct(int $customerId, Address $delivery, DateTime $placedAt, Product ...$products)
    {
        $this->customerId = $customerId;
        $this->delivery = $delivery;
        $this->placedAt = $placedAt;
        $this->products = $products;
    }

    public function getCustomerId(): int
    {
        return $this->customerId;
    }

    public function getDelivery(): Address
    {
        return $this->delivery;
    }

    public function getPlacedAt(): DateTime
    {
        return $this->placedAt;
    }

    /**
     * @return Product[]
     */
    public function getProducts(): array
    {
        return $this->products;
    }
}

首先,将其添加到 config/serialization.php(见上一节)。

use App\Order;

return [
    ...
    Order::class => [],
];

然后在路由文件中,将 App\Order 对象注入或返回到路由

use App\Order;

Route::post('/', function (Order $create) {
    ...
});

Route::get('/', function (): Order {
    return new Order(...);
});

高级配置

您可能需要在必要时对值对象进行高级编码和解码。请参阅 thiagocordeiro/serializer 文档以获取这些配置。

注意

  1. 值对象不应具有复杂的逻辑以及没有基础设施耦合,换句话说,它们应该是具有构造函数、私有属性和获取器的哑对象。thiagocordeiro/serializer 不依赖于公共属性。
  2. 不需要将继承对象添加到 config/serialization.php 中,但是它们将在运行时创建,这可能会在应用程序预热时产生影响。通过将继承对象添加到配置文件中,它们可能在清除缓存命令期间创建。

贡献

请随意打开问题、建议更改和提交 PR :)

支持

如果您想支持更改,可以向以下地址捐款。

比特币地址:bc1qfyudlcxqnvqzxxgpvsfmadwudg4znk2z3asj9h