braunstetter/media-bundle

使用 symfony 上传和管理媒体文件的所需一切。

安装: 381

依赖项: 0

建议者: 0

安全性: 0

星星: 1

关注者: 1

分支: 0

开放问题: 0

类型:symfony-bundle

v0.1.3 2024-01-10 05:11 UTC

This package is auto-updated.

Last update: 2024-09-28 11:25:56 UTC


README

License

此 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

此方法组合了一个 folderfilename
这两个属性都必须设置。否则,此方法返回 null。

getType

您文件的类型。
默认情况下,它是文件实体类名称的小写。
您应该根据媒体类型来命名您的媒体实体。例如 ImageDocument

连接媒体实体

一旦您定义了您的媒体实体,您可以将它们连接到其他实体。这将是一个包含一些与它链接的 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;
    }
}

为了简单起见,建议在每种情况下都使用多对多关系。如果您需要限制您的图像,您可以通过验证来做到这一点,并且/或者通过使用 MediaCollectionTypemax_items 选项。

表单类型

这个 Bundle 的好处是 - 它带有表单类型。

完整示例

这是一个可编辑的 Image 实体集合的示例

$form->add('image', MediaCollectionType::class, [
    'entry_type' => ImageType::class,
    'entry_options' => [
        'required' => false,
        'label' => false,
    ],
    'allow_add' => true,
    'allow_delete' => true
])

这将为您提供友好的用户界面。这是简单空白表单的截图

blank UI

所有截图(由 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的所有选项都包含在MediaCollectionTypeentry_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

路线图

还有一些功能肯定会到来。

  1. 移除上传器(FlysystemBundle是正确的选择。)
  2. 可拖拽UI(使媒体对象可拖拽)
  3. 更多FormTypes。(文档、PDF、音频...)

欢迎您帮助实现这些功能。如果您有任何建议,请随时提出问题。

另一个好主意是在此Bundle之上编写一个MediaLibraryBundle - 使用symfony-ux生态系统。