bukashk0zzz/liip-imagine-serialization-bundle

提供LiipImagineBundle和JMSSerializerBundle之间的集成。

v3.2.0 2022-01-26 06:48 UTC

This package is auto-updated.

Last update: 2024-08-26 12:28:54 UTC


README

Build Status Code Coverage Scrutinizer Code Quality License Latest Stable Version Total Downloads

SensioLabsInsight

关于

提供LiipImagineBundleJMSSerializerBundle之间的集成。允许在序列化过程中生成实体字段的全路径或相对路径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"
}

设置includeHostfalse时生成的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