yucadoo / polymorphic-fractal
PHP League's Fractal 包的多态转换器实现。
1.0.0
2020-04-16 10:18 UTC
Requires
- php: ~7.2
- league/fractal: ^0.19.2
- mouf/alias-container: ^2.0
Requires (Dev)
- phpunit/phpunit: >=8.0
- squizlabs/php_codesniffer: ^3.0
Suggests
- yucadoo/singleton-container: Allows caching and reuse of transformers.
This package is auto-updated.
Last update: 2024-09-16 19:41:57 UTC
README
PHP League's Fractal 包的多态转换器实现。适用于例如通知流的订阅。多态转换器可以像其他转换器一样使用,因此与基于 Fractal 构建的包兼容。本包符合 PSR-1、PSR-2、PSR-4 和 PSR-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
贡献
有关详细信息,请参阅 CONTRIBUTING 和 CODE_OF_CONDUCT。
安全性
如果发现任何安全相关的问题,请通过电子邮件 hrcajuka@gmail.com 而不是使用问题跟踪器。
致谢
许可证
MIT 许可证(MIT)。有关更多信息,请参阅 许可证文件。