thiagocordeiro / laravel-serializer
1.0.14
2024-02-19 08:53 UTC
Requires
- php: >=8.2
- ext-json: *
- laravel/framework: >=9.0.0
- thiagocordeiro/serializer: ^3.2
Requires (Dev)
- phpunit/phpunit: ^10.0
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 文档以获取这些配置。
注意
- 值对象不应具有复杂的逻辑以及没有基础设施耦合,换句话说,它们应该是具有构造函数、私有属性和获取器的哑对象。thiagocordeiro/serializer 不依赖于公共属性。
- 不需要将继承对象添加到
config/serialization.php
中,但是它们将在运行时创建,这可能会在应用程序预热时产生影响。通过将继承对象添加到配置文件中,它们可能在清除缓存命令期间创建。
贡献
请随意打开问题、建议更改和提交 PR :)
支持
如果您想支持更改,可以向以下地址捐款。
比特币地址:bc1qfyudlcxqnvqzxxgpvsfmadwudg4znk2z3asj9h