davenorthcreek/laravel-serializer

JMS Serializer 与 Laravel 的集成!

1.0.1 2017-11-21 21:42 UTC

This package is not auto-updated.

Last update: 2024-09-29 03:15:33 UTC


README

将 JMS 序列化库绑定到 Laravel,允许根据正常的 Laravel 配置约定定义模式。

设置

为了在项目中使用 Laravel 序列化器,请按照设置 Laravel 包的常规步骤进行。

  • atrauzzi/laravel-serializer 添加到您的 composer.json 文件中。
  • 在项目的根目录运行 composer update
  • 编辑您的 app/config/app.php 文件并在 providers 数组的底部附近添加以下内容:
    • Atrauzzi\LaravelSerializer\JMSSerializerServiceProvider::class,
  • 在设置过程中,创建配置的副本 ./artisan config:publish atrauzzi/laravel-serializer
Note: Because this package does not perform any data storage, no migrations are required.

配置

在内部,JMS 序列化库使用元数据映射。通常这些通过 XML、YAML 或正在序列化的类上的注解进行配置。另一方面,Laravel 序列化器具有意见,即这些定义应位于业务对象外部,并保持 Laravel 项目的本地格式。因此,映射存储为 Laravel 配置数组系统的一部分。

如果您想覆盖此设置并配置序列化器使用默认或您制作的自定义元数据驱动程序工厂,您只需在依赖注入容器中重新绑定 JMS\Serializer\Builder\DriverFactoryInterface

映射

如果您打开在设置步骤中创建的 config.php 的副本,您将看到其中已经填充了一个示例序列化映射。

映射配置模式相当简单,遵循以下形式:

[
    'mappings' => [
        'My\Namespace\Domain\User' => [
            'attributes' => [
                'id' => 'integer',
                'name' => [
                    'type' => 'string'
                ]
            ]
        ]
    ]
]

mappings 下的每个键都是将要序列化的对象的完全限定类名。每个类中 attributes 下的每个键都是一个属性或变更器方法(有关变更器的更多信息,请参阅使用部分)。在 mappings 下指定的每个键的值可以是 arraystring 或未指定。当值是字符串时,该字符串将是该字段的类型。当值是数组时,可以针对单个字段指定多个配置指令。没有值的键将使用最佳猜测默认映射配置。

使用

因为您正在查找序列化数据,所以我假设您在项目中已经有某种形式的领域对象。

在执行序列化时,映射配置中的每个字段都指示一个属性或变更器方法,类似于可以在 Eloquent 模型上创建的变更器。也就是说,如果您使用任何其他 ORM 和/或 POPO,您也可以定义遵循相同约定的方法。

序列化是通过从 Laravel 容器请求 JMS\Serializer\Serializer 实例来完成的。一旦您有了这个实例,您就可以按照 正常的 JMS 序列化器文档 中的说明使用它。

让我们假设以下映射配置

...
[
	'attributes' => [
		'firstName'
		'fullName' => [
			'type' => 'string'
		]
	]
]
...

以及与之相关的业务对象定义

protected $firstName;

protected $lastName;

public function getFullNameAttribute() {
    return $this->userName . ' ' . $this->lastName;
}

您的控制器看起来可能像这样

/** @var \JMS\Serializer\Serializer */
protected $serializer;

/**
 * @param \JMS\Serializer\Serializer $serializer
 */
public function __construct(
	Serializer $serializer
) {
	$this->serializer = $serializer;
}

public function myController() {
    // ...
	$serializedData = $this->serializer->serialize($myInstance, 'json');
    // ...
}

在这种情况下,当序列化为 JSON 时,将生成以下模式

{
    "_type": "...",
    "first_name": "...",
    "full_name": "... ..."
}

正如您所看到的,输出了firstName,而fullName则是通过firstNamelastName进行变异得来的。但是,独立的lastName属性没有输出,因为它没有在映射配置中指定。您也可能注意到生成了一个_type字段,这为可能对混合和多项式结果集感兴趣的消费方提供了便利。

关注点分离

您可能会想到——尤其是如果您正在使用Doctrine——并不是所有变异函数都应该放在包含它们所变异数据类的类中。通常,变异可能是两个或更多关注点情境性组合的结果。最常见和最好的例子是为对象生成规范URI。理想情况下,您不应该在模型上编写getUri方法,因为这会创建不良的隐式依赖。

在这些情况下,利用组合并创建一个可以被Laravel依赖注入容器管理的类更有意义。在调用其__construct方法之后,此类实例将分配给模型对象的实例。

class PostSerializer {

    protected $uriGeneratorService;

    protected $post;

    public function __construct(UriGeneratorService $uriGeneratorService) {
        $this->uriGeneratorService = $uriGeneratorService;
    }

    public function setPost(Post $post) {
        $this->post = $post;
    }

    public function getUriAttribute() {
        return $this->uriGeneratorService->getUriForPost($this->post);
    }

}

根据上面的例子,可以通过将数据向上传递的变异函数输出发自Post的附加属性。在这种情况下,PostSerializer已经变成了一种视图,通过保持合理的关注点分离来帮助保持领域类清洁和便携。

Eloquent

Laravel的默认ORM是Eloquent,它是操作查询和建模数据的一个非常方便的工具。作为副作用,它往往在模型类内捆绑了许多非领域关注点。而不是忽略这些有用的元数据,这个集成尝试利用它来最小化您在编写项目代码时的努力。以下是您在使用Eloquent进行数据存储时可以享受的一些快捷方式列表。

  • 当存在时,Laravel Serializer会检测并使用变异函数。
  • 在设置元数据时,会读取Model子类的$visible属性。假定每个字段最基础的设置,但这可能满足您的需求,如果这样,意味着您不需要在模型类之外创建配置映射。

元数据

本库的文档和部分功能仍在发展中。如果您想贡献或建议一个功能或改进,请不要犹豫,在GitHub上提交一个ticket!:)

致谢

Laravel Serializer是由Alexander Trauzzi创建和维护的。