padawansoftware/uploader-bundle

VichUploaderBundle 的包装器

安装: 24

依赖者: 0

建议者: 0

安全: 0

星标: 0

关注者: 1

分支: 0

类型:symfony-bundle

dev-master 2019-11-19 12:28 UTC

This package is not auto-updated.

Last update: 2024-10-03 09:43:46 UTC


README

UploaderBundle 是 VichUploaderBundle 的包装器。

此扩展包通过提供一个基础资产实体类和一组管理工具,为资产管理提供便利。

配置 VichUploaderBundle

由于此扩展包仅作为 VichUploaderBundle 的包装器,您必须首先进行配置

配置必须有一个名为 asset 的映射,该映射将用于我们的 Asset 实体

# config/packages/vich_uploader.yaml or app/config/config.yml
vich_uploader:
    db_driver: orm

    mappings:
        asset: # it is important that one mapping has name asset
            uri_prefix: /media
            upload_destination: '%kernel.project_dir%/public/media'

作为独立类使用实体

如果您计划将实体类作为独立类使用,而不是与另一个实体相关联,则只需创建一个继承自扩展包 Asset 的类即可

use Doctrine\ORM\Mapping as ORM;
use PSUploaderBundle\Entity\Asset as BaseAsset;

/**
 * @ORM\Entity
 */
class Asset extends BaseAsset {
}

这就足够了。现在当您创建/更新数据库模式时,将创建一个新的类

+------------------+--------------+------+-----+---------+----------------+
| Field            | Type         | Null | Key | Default | Extra          |
+------------------+--------------+------+-----+---------+----------------+
| asset_id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| asset_name       | varchar(255) | NO   |     | NULL    |                |
| asset_updated_at | date         | NO   |     | NULL    |                |
+------------------+--------------+------+-----+---------+----------------+

使用关联实体 Asset

通常,Asset 实体与另一个实体相关联。例如,博客中的一篇文章可能有相关的图像作为标题,或者教程可以有一个下载文件。因此,此扩展包提供了管理关联的工具。

要关联 Asset 与另一个实体,请在实体类中添加 Doctrine ORM 关联。

use Doctrine\ORM\Mapping as ORM;

class Post
{
    /**
     * @var Asset
     *
     * @ORM\OneToOne(targetEntity="Asset")
     * @ORM\JoinColumn(name="post_image", referencedColumnName="asset_id")
     */
    protected $image;
}

现在您可以从关联实体获取我们的资产。

当将实体与 Asset 关联时,可能只会关联到一个实体,或者可以关联到多个实体。

与一个实体关联

如果您仅将 Asset 关联到一个实体,您也可以在 Asset 端添加关联

use Doctrine\ORM\Mapping as ORM;
use PSUploaderBundle\Entity\Asset as BaseAsset;

/**
 * @ORM\Entity
 */
class Asset extends BaseAsset {

    /**
     * @var mixed
     *
     * The post this asset it attached to
     *
     * @ORM\OneToOne(targetEntity="Post", mappedBy="asset")
     */
    protected $post;
}

您还需要在关联实体中进行更改

use Doctrine\ORM\Mapping as ORM;

class Post
{
    /**
     * @var Asset
     *
     * @ORM\OneToOne(targetEntity="Asset", inversedBy="post")
     * @ORM\JoinColumn(name="post_image", referencedColumnName="asset_id")
     */
    protected $image;
}

这样,您也可以从 Asset 实体中获取关联实体。

与多个实体关联

正如我们之前所评论的,如果您计划将 Asset 实体与多个实体关联,您不能在 Asset 实体中添加关联,因为您需要指定 targetEntity。这并不意味着您不能从 Asset 实体中获取关联实体。幸运的是,此扩展包有解决方案

首先,您的 Asset 类必须实现 PSUploaderBundle\Library\Interfaces\EntityAssetInterface 以及定义的两个方法

use Doctrine\ORM\Mapping as ORM;
use PSUploaderBundle\Entity\Asset as BaseAsset;
use PSUploaderBundle\Library\Interfaces\EntityAssetInterface;

/**
 * @ORM\Entity
 */
class Asset extends BaseAsset implements EntityAssetInterface
{
    /**
     * @var mixed
     *
     * The entity this asset it attached to
     */
    protected $entity;


    /**
     * @return mixed
     */
    public function getEntity()
    {
        return $this->entity;
    }

    /**
     * @param mixed $entity
     *
     * @return self
     */
    public function setEntity($entity)
    {
        $this->entity = $entity;

        return $this;
    }
}

然后在您的关联实体中,您必须使用注解标注包含 Asset 的字段

use Doctrine\ORM\Mapping as ORM;
use PSUploaderBundle\Library\Annotation\Asset as AssetAnnotation;

/**
 * @AssetAnnotation("image")
 **/
class Post
{
    /**
     * @var Asset
     *
     * @ORM\OneToOne(targetEntity="Asset")
     * @ORM\JoinColumn(name="post_image", referencedColumnName="asset_id")
     */
    protected $image;
}

最后,您必须将 PSUploaderBundle\EventListener\InjectEntityListener 作为服务注册

    PSUploaderBundle\EventListener\InjectEntityListener:
        tags:
            - { name: doctrine.event_subscriber }

InjectEntityListener 的作用是在从数据库获取实体时监听,如果该实体有关联的 Asset,则将其注入到 Asset 中。

为图像 Asset 添加验证

您可能希望为 Asset 添加一个 Image 验证约束。约束必须设置在最终字段上,因此尝试在关联实体的 Asset 字段中添加它们将不会工作,因为这不是真正的文件

use Doctrine\ORM\Mapping as ORM;
use PSUploaderBundle\Library\Annotation\Asset as AssetAnnotation;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @AssetAnnotation("image")
 **/
class Post
{
    /**
     * @var Asset
     *
     * @ORM\OneToOne(targetEntity="Asset")
     * @ORM\JoinColumn(name="post_image", referencedColumnName="asset_id")
     *
     * Assert image and 23/9 aspect ratio
     * @Assert\Image (
     *  minRatio = 2.55,
     *  maxRatio = 2.56
     * )
     */
    protected $image;
}

幸运的是,此扩展包提供了一个自定义的 Image 约束来解决这个问题

use Doctrine\ORM\Mapping as ORM;
use PSUploaderBundle\Library\Annotation\Asset as AssetAnnotation;
use PSUploaderBundle\Library\Validation\ImageAsset as ImageAssetConstraint;

/**
 * @AssetAnnotation("image")
 **/
class Post
{
    /**
     * @var Asset
     *
     * @ORM\OneToOne(targetEntity="Asset")
     * @ORM\JoinColumn(name="post_image", referencedColumnName="asset_id")
     *
     * Assert image and 23/9 aspect ratio
     * @ImageAssetConstraint (
     *  minRatio = 2.55,
     *  maxRatio = 2.56
     * )
     */
    protected $image;
}