ynloultratech/graphql-media-service

使用 GraphQL API 提供和管理文件

This package is auto-updated.

Last update: 2024-08-29 04:48:29 UTC


README

构建您的应用程序时,您可能需要图片、视频,甚至可能还需要演示文稿。GraphQL Media Service 处理所有这些媒体资产,并将它们集中起来,以便您可以按照您喜欢的方式找到内容:快速且高效。

  • 通过单个端点通过 API 上传您的文件。
  • 用于获取详细信息和解压 URL 的文件 GraphQL 对象。
  • 使用签名 URL 的公共和私有文件
  • 文件与实体之间的直接关系

安装

使用 composer 安装

composer require graphql-media-service

它是如何工作的?

使用方法

以下步骤假设您已经使用 graphql-bundle 配置了 GraphQL API。

在您的 config.yml 中添加以下配置

#config.yml

media_service:
    class: AppBundle\Entity\File
    default_storage: public_files
    storage:
       public_files:
          local:
              dir_name: "%kernel.root_dir%/../public/uploads"
              base_url: 'http://example.com/uploads'

出于性能原因,公共文件直接通过 http 服务器提供,因此 base_url 必须是一个有效的公共可访问文件夹,其中包含文件。

创建一个新的实体 File

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Ynlo\GraphQLBundle\Annotation as GraphQL;
use Ynlo\GraphQLMediaService\Model\AbstractFile;

/**
 * @ORM\Entity()
 * @ORM\Table()
 *
 * @GraphQL\ObjectType()
 */
class File extends AbstractFile
{

}

在这种情况下,您必须在您的 graphql 模式中有名为 uploadFile 的突变,有关使用多部分表单数据上传文件的详细信息,请参阅 graphql-multipart-request-spec

将上传的文件分配给现有对象

上传文件到服务器只是第一步,您必须能够将这些文件链接到现有对象。例如,将上传的照片链接到用户个人资料。

在现有实体上创建一个字段来存储关系

/**
 * @ORM\Entity()
 * @ORM\Table()
 *
 * @GraphQL\ObjectType()
 */
class Profile implements NodeInterface
{
//....
/**
 * @var File
 *
 * @ORM\OneToOne(targetEntity="AppBundle\Entity\File", orphanRemoval=true)
 *
 * @GraphQL\Expose()
 *
 * @MediaService\AttachFile()
 */
protected $photo;

注意,在链接到文件的属性上需要标注 @MediaService\AttachFile(),以便在运行时解决一些参数,如 url

@TODO ...