yucadoo/polymorphic-fractal

PHP League's Fractal 包的多态转换器实现。

1.0.0 2020-04-16 10:18 UTC

This package is auto-updated.

Last update: 2024-09-16 19:41:57 UTC


README

Latest Version on Packagist Software License Build Status Coverage Status Quality Score Total Downloads

PHP League's Fractal 包的多态转换器实现。适用于例如通知流的订阅。多态转换器可以像其他转换器一样使用,因此与基于 Fractal 构建的包兼容。本包符合 PSR-1PSR-2PSR-4PSR-11。如果发现合规性问题,请通过 pull request 提交补丁。

安装

通过 Composer

$ composer require yucadoo/polymorphic-fractal

用法

use League\Fractal\Manager;
use League\Fractal\Resource\Collection;
use Mouf\AliasContainer\AliasContainer;
use YucaDoo\PolymorphicFractal\Transformer as PolymorphicTransformer;

// Get heterogeneous data
$objects = array(
    new Like($liker, $post),
    new Comment($commentator, $post),
);

// Create transformer instance, your framework can probably do this automatically.
/** @var Psr\Container\ContainerInterface */
$container;
// Wrap framework specific container with aliasing decorator.
// This allows us to define mapping from item classes to transformer classes.
// We'll call this transformer registry.
$registry = new AliasContainer($container);
$polymorphicTransformer = new PolymorphicTransformer($registry);

// The registry can also be got using the getRegistry() method
$registry = $polymorphicTransformer->getRegistry();
// Configure registry, you'll probably do this in a service provider or in a transformer subclass.
$registry->alias(Like::class, LikeTransformer::class);
$registry->alias(Comment::class, CommentTransformer::class);

// Configure manager and use the transformer as usual
$manager = new League\Fractal\Manager();
// Optionally set serializer
// Optionally parse includes and excludes

$resource = new Collection($objects, $polymorphicTransformer);
$manager->createData($resource)->toArray();

如上例所示,使用转换数据的类来从转换器注册表中获取转换器。可以通过重写 getRegistryKey() 方法来修改此行为。

use Mouf\AliasContainer\AliasContainer;
use YucaDoo\PolymorphicFractal\Transformer as PolymorphicTransformer;

class NotificationTransformer extends PolymorphicTransformer
{
    public function __construct(AliasContainer $registry)
    {
        parent::__construct($registry);
        $registry->alias('like', LikeTransformer::class);
        $registry->alias('comment', CommentTransformer::class);
    }

    protected function getRegistryKey($data)
    {
        return $data['type'];
    }
}

$notifications = array(
    array(
        'type' => 'like'
        'liker' => ...,
        ...
    ),
    array(
        'type' => 'comment'
        'commentator' => ...,
        ...
    ),
);
$resource = new Collection($notifications, $notificationTransformer);

技巧

为了防止相同转换器的重复实例化,请在将框架的 IoC 容器传递到 AliasContainer 之前,用 yucadoo/singleton-container 包 提供的 SingletonContainer 装饰器包装。

变更日志

有关最近更改的详细信息,请参阅 CHANGELOG

测试

$ composer test

贡献

有关详细信息,请参阅 CONTRIBUTINGCODE_OF_CONDUCT

安全性

如果发现任何安全相关的问题,请通过电子邮件 hrcajuka@gmail.com 而不是使用问题跟踪器。

致谢

许可证

MIT 许可证(MIT)。有关更多信息,请参阅 许可证文件