padawansoftware / uploader-bundle
VichUploaderBundle 的包装器
Requires
- doctrine/orm: ^2.6
- vich/uploader-bundle: ^1.10
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; }