sirroland / liip-imagine-serialization-bundle
提供 LiipImagineBundle 和 JMSSerializerBundle 之间的集成。
Requires
- php: >=7.1.0
- doctrine/orm: ^2.5
- jms/serializer-bundle: ^2.0|^3.0
- liip/imagine-bundle: ^2.0
- symfony/dependency-injection: ^3.3|^4.0
- symfony/yaml: ^3.3|^4.0
- vich/uploader-bundle: ^1.5
Requires (Dev)
README
关于
提供 LiipImagineBundle 和 JMSSerializerBundle 之间的集成。允许在序列化过程中生成实体字段的完整或相对 URI,这些字段通过 @Bukashk0zzz
和 @JMS
注解映射。此外,捆绑包还支持 VichUploaderBundle 字段类型。
使用 Symfony Flex 安装
composer config extra.symfony.allow-contrib true
composer require bukashk0zzz/liip-imagine-serialization-bundle
不使用 Symfony Flex 安装
composer require bukashk0zzz/liip-imagine-serialization-bundle
将捆绑包添加到 app/AppKernel.php
$bundles = array( // ... other bundles new Bukashk0zzz\LiipImagineSerializationBundle\Bukashk0zzzLiipImagineSerializationBundle(), );
配置
将以下内容添加到您的 config.yml
bukashk0zzz_liip_imagine_serialization: # Set true for generating url for vichUploader fields vichUploaderSerialize: false # Set true for generating url with host for vichUploader fields includeHost: false # Set true for adding original field value to object includeOriginal: false # Set true for adding host url to original value for vichUploader fields includeHostForOriginal: false # You can pass there your UrlNormalizer class that implements UrlNormalizerInterface originUrlNormalizer: null # You can pass there your UrlNormalizer class that implements UrlNormalizerInterface filteredUrlNormalizer: null
用法
将以下类添加到您的实体类的 use
部分。
use Bukashk0zzz\LiipImagineSerializationBundle\Annotation as Bukashk0zzz;
捆绑包提供了两个注解,允许在实体中序列化 URL 或 @Vich\UploadableField
字段。首先,您必须将 @Bukashk0zzz\LiipImagineSerializableClass
添加到具有图像字段的实体类中。然后,您必须将 @Bukashk0zzz\LiipImagineSerializableField
注解添加到您想要序列化的字段。
@Bukashk0zzz\LiipImagineSerializableClass
注解没有任何选项。@Bukashk0zzz\LiipImagineSerializableField
注解有一个必需的选项 filter,其值应链接到 LiipImagine 过滤器。
可以设置如下 @Bukashk0zzz\LiipImagineSerializableField("photoFile")
或 @Bukashk0zzz\LiipImagineSerializableField(filter="photoFile")
。在这种情况下,filter 可以是过滤器的数组,此时序列化字段也将是数组。例如,如果您为 image
字段添加注解 @Bukashk0zzz\LiipImagineSerializableField(filter={"big", "small"})
,那么您将得到
{ "image": { "big": "/uploads/users/big/5659828fa80a7.jpg", "small": "/uploads/users/small/5659828fa80a7.jpg" } }
还有另外两个选项
vichUploaderField
- 如果您使用 VichUploaderBundle 进行上传,您必须指定具有@Vich\UploadableField
注解的字段链接virtualField
- 默认情况下,序列化程序将用链接到过滤图像的链接覆盖字段值。如果您添加virtualField
选项,序列化程序将向序列化对象添加一个新字段,其名称由您在选项中提供,以及过滤图像的 URL,在这种情况下原始字段将不附加。如果您使用过滤器数组,则需要此选项。
不要忘记,为了序列化图像字段,它们也必须用 @JMS
注解标记以进行序列化。
默认生成的 URI
{ "photo": "http://example.com/uploads/users/photos/5659828fa80a7.jpg", "cover": "http://example.com/uploads/users/covers/456428fa8g4a8.jpg" }
将 includeHost
设置为 false
时生成的 URI
{ "photo": "/uploads/users/photos/5659828fa80a7.jpg", "cover": "/uploads/users/covers/456428fa8g4a8.jpg" }
如果您需要在传递给 LiipImagine 之前更改 URL,例如需要交换原始名称,您可以在捆绑包配置中使用 originUrlNormalizer 选项。
bukashk0zzz_liip_imagine_serialization: originUrlNormalizer: AppBundle\Normalizer\UrlNormalizer
如果您需要在 LiipImagine 处理之后更改 URL,例如需要交换原始域名,您可以在捆绑包配置中使用 filteredUrlNormalizer 选项。
bukashk0zzz_liip_imagine_serialization: filteredUrlNormalizer: AppBundle\Normalizer\UrlNormalizer
UrlNormalizer 类必须实现 UrlNormalizerInterface
<?php namespace AppBundle\Normalizer; use Bukashk0zzz\LiipImagineSerializationBundle\Normalizer\UrlNormalizerInterface; /** * Url normalizer */ class UrlNormalizer implements UrlNormalizerInterface { /** * {@inheritdoc} */ public function normalize($url){ return str_replace('photo.jpg', 'my_photo.jpg', $url); } }
事件
有两个事件
- bukashk0zzz_liip_imagine.event_pre_origin_normalize // 在原始 URL 规范化之前触发
- bukashk0zzz_liip_imagine.event_pre_filtered_normalize // 在过滤 URL 规范化之前触发
示例订阅者
services: app.liip_imagine_serialization_subscriber: class: AppBundle\Subscribers\LiipImagineSerializationEventSubscriber tags: - { name: bukashk0zzz_liip_imagine_subscriber }
<?php namespace AppBundle\Subscribers; use Bukashk0zzz\LiipImagineSerializationBundle\Event\UrlNormalizerEvent; use Symfony\Component\EventDispatcher\EventSubscriberInterface; /** * LiipImagineSerializationEventSubscriber */ class LiipImagineSerializationEventSubscriber implements EventSubscriberInterface { /** * @return array */ public static function getSubscribedEvents() { return [ UrlNormalizerEvent::ORIGIN => [ ['normalizeOrigin', 10], ], UrlNormalizerEvent::FILTERED => [ ['normalizeFiltered', 10], ], ]; } /** * @param UrlNormalizerEvent $event */ public function normalizeOrigin(UrlNormalizerEvent $event) { $event->setUrl(str_replace('photo', 'newPhoto', $event->getUrl())); } /** * @param UrlNormalizerEvent $event */ public function normalizeFiltered(UrlNormalizerEvent $event) { $event->setUrl(str_replace('example.com', 'img.example.com', $event->getUrl())); } }
示例
<?php namespace AppBundle\Entity; use Doctrine\ORM\Mapping as ORM; use JMS\Serializer\Annotation as JMS; use Vich\UploaderBundle\Mapping\Annotation as Vich; use Bukashk0zzz\LiipImagineSerializationBundle\Annotation as Bukashk0zzz; use Symfony\Component\HttpFoundation\File\File; /** * User Entity * * @ORM\Table(name="users") * @ORM\Entity() * * @Vich\Uploadable * @Bukashk0zzz\LiipImagineSerializableClass */ class User { /** * @var string $coverUrl Cover url * * @ORM\Column(type="string", length=255) * * @JMS\Expose * @JMS\SerializedName("cover") * * @Bukashk0zzz\LiipImagineSerializableField("thumb_filter") */ public $coverUrl; /** * @var string $photoName Photo name * * @ORM\Column(type="string", length=255) * * @JMS\Expose * @JMS\SerializedName("photo") * * @Bukashk0zzz\LiipImagineSerializableField("thumb_filter", vichUploaderField="photoFile") */ public $photoName; /** * @var File $photoFile Photo file * * @JMS\Exclude * * @Vich\UploadableField(mapping="user_photo_mapping", fileNameProperty="photoName") */ public $photoFile; }
版权 / 许可证
见 LICENSE