braunstetter / media-bundle
使用 symfony 上传和管理媒体文件的所需一切。
Requires
- php: ^8.0
- braunstetter/helper: ^0
- doctrine/orm: ^2.11
- symfony/asset: ^6.0
- symfony/form: ^6.0
- symfony/framework-bundle: ^6.0
- symfony/mime: ^6.0
- symfony/string: ^6.0
- webmozart/assert: ^1.1
Requires (Dev)
- dbrekelmans/bdi: ^1.0
- doctrine/doctrine-bundle: ^2.5
- matthiasnoback/symfony-dependency-injection-test: ^4.2
- nyholm/symfony-bundle-test: 1.8.1
- symfony/debug-bundle: ^6.0
- symfony/panther: ^2.0
- symfony/test-pack: ^1.0
- symfony/twig-bundle: ^4.4|^5.0|^6.0
- symplify/amnesia: ^10.2
README
此 Bundle 旨在使处理媒体实体变得简单。
它提供了一个通用的 API,用于与媒体对象相关的所有内容,而不限制您的灵活性。
BaseFile 实体
一个 doctrine MappedSuperclass,您的文件应该始终扩展。
它提供了您启动所需的所有基本功能。
创建文件 App\Entity\Image
<?php namespace App\Entity; use Braunstetter\MediaBundle\Entity\BaseFile; class Image extends BaseFile { }
并迁移您的数据库
symfony console make:migration && symfony console doctrine:migrations:migrate
这看起来并不多 - 但在这个阶段,您正在使用一个接口 (FileInterface
),您的上传器和表单可以与之一起使用。
此外,您还获得了一些基本的方法和属性,您可以进一步操作和扩展。
重要方法
这些是您绝对应该熟悉的函数。
BaseFile 实体的外部属性和方法在类内部有文档说明。
getFullPath
此方法组合了一个 folder
和 filename
。
这两个属性都必须设置。否则,此方法返回 null。
getType
您文件的类型。
默认情况下,它是文件实体类名称的小写。
您应该根据媒体类型来命名您的媒体实体。例如 Image
或 Document
。
连接媒体实体
一旦您定义了您的媒体实体,您可以将它们连接到其他实体。这将是一个包含一些与它链接的 Image
的完整 Page
实体。
namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use App\Entity\Media\Image; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; #[ORM\Entity()] class Page { #[ORM\ManyToMany(targetEntity: Image::class, cascade: ["ALL"], orphanRemoval: true)] private $image; public function __construct() { $this->image = new ArrayCollection(); } public function getImage(): Collection { return $this->image; } public function addImage(Image $image): self { if (!$this->image->contains($image)) { $this->image[] = $image; } return $this; } public function removeImage(Image $image): self { $this->image->removeElement($image); return $this; } }
为了简单起见,建议在每种情况下都使用多对多关系。如果您需要限制您的图像,您可以通过验证来做到这一点,并且/或者通过使用
MediaCollectionType
的max_items
选项。
表单类型
这个 Bundle 的好处是 - 它带有表单类型。
完整示例
这是一个可编辑的 Image 实体集合的示例
$form->add('image', MediaCollectionType::class, [
'entry_type' => ImageType::class,
'entry_options' => [
'required' => false,
'label' => false,
],
'allow_add' => true,
'allow_delete' => true
])
这将为您提供友好的用户界面。这是简单空白表单的截图
所有截图(由 panther 自动创建)在您运行测试套件后都可在文件夹 tests/tests/Functional/Ui/screenshots
中找到。
choose_file
是文件输入按钮的翻译字符串。
您可以通过在媒体命名空间中创建翻译文件(例如 media.fr.yaml)来翻译它。您可以在vendor/braunstetter/media-bundle/src/Resources/translations
中查看所有可用的翻译。
可用的表单类型
如果您需要更多的表单类型,请考虑提交一个 issue 或通过提交一个 PR 来贡献。
MediaCollectionType
这是最重要的类型。它继承自本地的 Symfony\Component\Form\Extension\Core\Type\CollectionType
,可以包含媒体表单类型的集合。
选项
max_items
此集合允许的最大项目数。默认为 9999
。
目前此选项仅由本 Bundle 的 JavaScript 使用。不会触发 PHP 验证。如果您想限制您的集合,请使用验证器。
include_css
确定是否应注入提供的CSS。默认为true
。
如果您想以自定义方式设置您的集合样式,可以使用此选项禁用默认CSS。
ImageType
此FormType专门用于图像。
选项
此FormType的所有选项都包含在MediaCollectionType
的entry_options
选项中
$form->add('image', MediaCollectionType::class, [ 'entry_type' => ImageType::class, 'entry_options' => [ 'required' => false, 'label' => false, // ... more options for ImageType ], ])
data_class
如果您决定以不同的名称命名您的Image实体或将它放入另一个命名空间中,您还必须调整data_class
选项。
此属性默认为App\Entity\Media\Image
。
placeholder_image_path
此图像字段的占位符图像的公共路径。
默认为bundles/media/images/image-placeholder.jpg
。
file_options
文件字段的选项数组。可用的选项列表可以在这里找到。
默认为空数组。
上传器
上传器只是一个您可以使用的类
$uploader->setFolder('/image/redactor') $uploader->upload($imageEntity)
您直接与实体(而不是文件或其路径)一起工作。
只要您的表单已使用文件填充了file
属性,图像就会上传。这很简单,也很有趣。
默认情况下,上传器会将文件保存到public/image/redactor/my-slugged-filename_2315g323.jpeg
。请注意文件名。它默认被slug化 - 并附加一个唯一id。您可以通过将false
作为第二个参数传递来禁用uniqFileName
。
$uploader->upload($imageEntity, false)
目前,此捆绑包提供了这些上传器
文件系统上传器
将文件保存到本地文件系统。目前没有特别之处。
贡献
如果您认为此捆绑包仍可改进和扩展,那么我们欢迎您的PR。
测试
为了确保一切正常工作 - 您必须运行测试套件。
您需要确保Panther在您的机器上正常工作。
然后您的测试应该会运行良好,只需执行一个简单的
composer install vendor/bin/bdi detect drivers yarn --cwd ./src/Resources/assets install --force yarn --cwd ./tests/app install --force yarn --cwd ./src/Resources/assets dev yarn --cwd ./tests/app dev ./vendor/phpunit/phpunit/phpunit
路线图
还有一些功能肯定会到来。
- 移除上传器(FlysystemBundle是正确的选择。)
- 可拖拽UI(使媒体对象可拖拽)
- 更多FormTypes。(文档、PDF、音频...)
欢迎您帮助实现这些功能。如果您有任何建议,请随时提出问题。
另一个好主意是在此Bundle之上编写一个
MediaLibraryBundle
- 使用symfony-ux生态系统。