bukashk0zzz / liip-imagine-serialization-bundle
提供LiipImagineBundle和JMSSerializerBundle之间的集成。
Requires
- php: >=7.2.0
- doctrine/orm: ^2.5
- jms/serializer-bundle: ^3.0|^4.0
- liip/imagine-bundle: ^1.8|^2.3
- symfony/dependency-injection: ^4.0|^5.0
- symfony/yaml: ^4.0|^5.0
- vich/uploader-bundle: ^1.5
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.8
- phpunit/phpunit: ^7.2
README
关于
提供LiipImagineBundle和JMSSerializerBundle之间的集成。允许在序列化过程中生成实体字段的全路径或相对路径URI,这些字段映射了带有@Bukashk0zzz
和@JMS
注解的@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