reshadman/file-secretary

摆脱Laravel中与文件相关的所有内容,此包为您处理所有这些。

1.1.12 2020-12-21 13:05 UTC

README

对于Laravel的新版本,请使用spatie/laravel-medialibrary。功能几乎相同,只是相同的文件被存储了多次。作为一个建议,如果您需要图像缩放功能,请使用像thumbor这样的东西,它更稳定、更安全、更可配置且更快。

Laravel文件管理员

Build Status Build Status

摆脱Laravel中与文件相关的所有内容,此包为您处理所有这些。

此包做什么?

  1. 处理您的公共资产(.css、.js等)您可以通过简单的函数调用使用您的CDN提供商来提供静态资产。例如,您可以通过Rackspace CDN提供您的静态文件。每次部署后,路径都会分配一个新的唯一ID,以便清除缓存资产。

  2. 图像处理和存储:在云中存储所有您的图像(基于Laravel适配器、Rackspace、S3、minio等),图像缩放通过简单配置处理。您定义模板,然后图像将自动生成。一旦创建了一个新的图像模板,您就可以使用包中包含的nginx指令来在后续调用中排除PHP的参与。阅读文档以获取更多信息。一种简单、快速且可靠的在云存储中处理图像的方法。

  3. 检测冗余文件,文件名基于文件大小+哈希函数生成,因此从技术上讲不可能存在冗余文件,您也可以实现自己的文件名生成器。

  4. 通过简单的方法调用存储文件。它们可以不涉及PHP提供服务,如果它们是公开的,则可以使用包的辅助函数进行引用。

  5. 数据库跟踪(可选),中心化的Eloquent模型,跟踪您的存储文件(和图像),您可以存储文件/可调整大小的图像并将它们附加到您的业务模型中。然后您可以使用它们。如果它是一个图像,则模板可以通过模型中的简单获取器访问。

  6. 简单的辅助函数用于处理可调整大小的图像URL、文件URL、资产URL等。

  7. 简单的控制器用于提供私有/公共文件提供可调整大小的图像和文件。您可以在请求上实现自己的访问控制,以限制访问。因此,例如,如果文件应该只对上传者提供服务,则可以实施一个访问控制器,该控制器检查请求的文件是否附加到用户模型。

入门

此包符合我的需求吗?

https://12factor.net 提供了一些处理文件的实用规范,称为 附加资源。由于文件是大多数信息系统的重要组成部分,它们应存储在可靠的、快速的第三方服务中(如Amazon S3或Rackspace对象存储)。

本包是使Laravel应用程序与12factor兼容的附加资源规范的实现。您可以使用自己的实现遵循此规范。

Attached Resources

因此,如果您的应用程序领域不涉及文件(您不是Dropbox或Amazon S3本身:D)。您可以遵循规范并使用本包提供的功能,文件通常有一些主要用途

  • 提供私有/公共文件(如PDF、文档等)
  • 提供可操作图像(需要重新大小、加水印等的图像),这需要大量计算/内存。
  • 提供静态资源(如css、js、svg)等。
  • 将业务领域文件附加并跟踪到其等效业务模型(如用户的个人资料图像)

Laravel文件秘书为上述需求提供了一些简单的解决方案。我们没有将包拆分为单独的包,以尊重简洁性。本包提供的接口可能更简单、性能更高,因为Laravel文件秘书是定期开发的,它不是最简单的形式。我们将记住在下一个版本中。

安装

在您的项目目录中运行以下命令,将包添加到 composer.json

composer require reshadman/file-secretary ">=1.0.0 <1.1.0"

将服务提供者添加到您的 config/app.php

<?php
return [
    // other app.php config elements
    'providers' => [
        // Other providers
        // ...
        \Reshadman\FileSecretary\Infrastructure\FileSecretaryServiceProvider::class    
    ]  
];

然后发布配置文件

php artisqan vendor:publish \
    --provider=Reshadman\FileSecretary\Infrastructure\FileSecretaryServiceProvider \
    --tag=config

如果您想使用eloquent模型将文件附加到您的模型上,导出迁移

php artisqan vendor:publish \
    --provider=Reshadman\FileSecretary\Infrastructure\FileSecretaryServiceProvider \
    --tag=migrations

配置

几乎所有事情都是由配置处理的,要了解此包的工作原理,请阅读此处默认配置文件中的文档块

config/file_secretary.php

使用

了解使用方法的最有效方法是阅读集成测试,但是您可以阅读以下文档以了解它的工作原理。

术语

上下文:文件秘书使用上下文根据Laravel文件系统驱动程序检测存储文件的位置,我们有四个上下文类别 basic_fileimagemanipulated_imageassets,所有上下文都应该有一个Laravel文件系统驱动程序和一个驱动程序中的文件夹名称。当您命令将文件存储在上下文中时,通过配置找到相应的Laravel磁盘驱动程序,并考虑上下文(上下文的文件夹)的起始路径(目录)。此外,文件URL的生成也由该配置处理。

上下文类别:basic_file:基本文件是不需要任何操作的基本文件,当定义上下文时,您可以指示一个 basic_file 上下文,当您命令存储文件时,它们将添加到上下文的Laravel文件系统驱动程序和给定的文件夹中。文件可以带或不带PHP的参与提供服务。

上下文类别:image:需要根据您提供的配置进行操作和修改的图像。存储可操作图像与存储简单文件没有区别,除了它们不是存储在唯一的文件名中,而是存储在唯一的目录中,因此主图像及其修改后的子图像始终在该唯一文件夹中。您还可以为主图像及其修改后的子图像使用不同的上下文策略。您可以指示主图像的修改图像根本不存储或存储在主图像旁边,或存储在不同的上下文中(因为修改图像不是关键的,它们可以存储在更经济的存储中,如您的服务器)。

上下文类别 manipulated_image:这是一个用于存储其处理后的图像的 image 上下文。

上下文类别: asset:如果您愿意,可以将整个构建好的资产目录上传到您的云 CDN 提供商,例如 Rackspace 的公共 CDN。

资产文件夹/标签:这些是您想要上传到云端的文件夹,通过在刀片模板中调用 fs_asset('assetFolderName', 'your_local_path_to.css') 来引用它们,资产在每次调用时都会被清理,因此浏览器不会提供旧版本。

图像模板:模板是负责修改和操作图像的对象。您可以使用默认的通用模板(它会根据不同的配置动态调整图像大小,去除图像),或者实现自己的模板。它们在配置中定义。

数据库/Eloquent 跟踪文件:在上下文中存储文件后,您可以将它分配给集中的 eloquent 模型,这个模型可以附加到其他业务模型,例如用户的个人资料图像。

文件/文件夹名称:在这个包的上下文中,文件名是一个自动生成的唯一标识符,它需要在您的应用程序上下文中是唯一的。您可以实现自己的文件名生成器。默认情况下,它是基于 sha1(fContent) + filesize,它保证了在上下文中同一文件不会重复。

提供文件/图像/处理后的图像:简单来说,您可以选择公开或私下提供文件,此包中有一个 HTTP 端点,它将提供请求的文件/图像,它从请求的 URL 中检索等效的 contextfile_name,并从找到的上下文存储中下载文件,然后将其提供给用户。在下载之前,它会调用找到的上下文的隐私对象,如果返回 false,则抛出 HTTP 400 异常。您可以为找到的上下文定义自己的隐私类,这将在文档中讨论。

定义上下文

您可以通过读取配置文件中的默认 config('file_secretary.contexts') 元素来查看创建上下文的所有可用选项。

在 Laravel 文件系统磁盘和磁盘中的起始文件夹(context_folder)方面,上下文必须是唯一的。

使用资产上传器

要通过公共 CDN(如 Rackspace 公共 CDN)提供静态资产,创建如下资产上下文

<?php return [
    // Other file secretary config elements...
    'contexts' => [
            // Other contexts...
            'assets_context' => [
                'category' => \Reshadman\FileSecretary\Application\ContextCategoryTypes::TYPE_ASSET,
                'driver' => 'rackspace_asset_disk',
                'context_folder' => 'some_context_folder',
                'driver_base_address' => 'some-unique-string.rackcdn.com/etc/',
            ]
    ],
    
    'asset_folders' => [
        'backoffice' => [
            'path' => public_path('backoffice-assets'),
            'context' => 'assets_context',
            // fills .env automatically like => BACKOFFICE_ASSET_ID=unique-id
            // which causes to the browser to not serve old versions.
            'env_key' => 'BACKOFFICE_ASSET_ID',
        ],    
    ]
];

其他事情将自动处理,在开发环境中,资产将在本地提供,在生产环境中,将从给定的 driver_base_address 提供服务。

要同步最新资产,运行

php artisan file-secretary:upload-assets --tags=backoffice

要在模板中引用资产,调用

<?php
$url = fs_asset('backoffice', 'styles.dist.css');

dump($url);
// In development env: http://localhost:8000/backoffice/styles.dist.css
// In production env: some-unique-id.rackcdn.com/[context_folder]/[latest-unique-id]/styles.dist.css

要删除旧版本:默认情况下,保留最后两个版本,其他版本在成功上传后被删除。对于不同的策略,您可以在 file_secretary.php 中更改以下事件监听器

<?php
return [
    // Other config file_secretary config elements
    'listeners' => [
        \Reshadman\FileSecretary\Application\Events\AfterAssetUpload::class => [
            '\YourListener\Class',    
        ]  
    ],  
];

存储文件

file-secretary 在您验证文件后负责存储文件。然后它们可以被跟踪和提供。

您可以将不同的文件目标传递给存储命令。对于存储文件,您应该创建以下类的实例

<?php

\Reshadman\FileSecretary\Application\PresentedFile::class;

要查看可用文件目标的列表,请阅读上述类的内容。

PresentedFile 类支持不同的文件类型,包括:URL文件路径文件内容文件实例,请阅读以下文档。

文件名

您无法控制文件名,它们用于跟踪文件和图像。

对于 basic_file 上下文的文件,存储格式可能如下所示

https://driver_base_address.mycdn.com/[context_folder]/[unique-id-xxxx-xxxxx].[file_extension]

对于 imagemanipulated_image 上下文的文件,文件名可能如下所示

# Main file
https://driver_base_address.mycdn.com/[context_folder]/[unique-id-xxxx-xxxx]/1_main.[image_extension]

# Manipulated templates:
https://driver_base_address.mycdn.com/[context_folder]/[unique-id-xxxx-xxxx]/[my_template_200x200.[image_extension_or_template_extension]

您可以在配置中定义自己的唯一标识符生成器

<?php 
return [
    'file_name_generator' => \OpensslRandomFileNameGenerator::class,
      
    // O1ther config elements...
];
?>

<?php

use Reshadman\FileSecretary\Application\FileUniqueIdGeneratorInterface;
use Reshadman\FileSecretary\Application\PresentedFile;

class OpensslRandomFileNameGenerator implements FileUniqueIdGeneratorInterface {
     public static function generate(PresentedFile $presentedFile)
     {
         $length = 128;
         return bin2hex(openssl_random_pseudo_bytes($length / 2));
     }
}
?>

请注意,您的闭包应始终返回一个唯一的字符串。

此函数防止在相同上下文中出现重复文件。

存储命令

在创建 PresentedFile 实例后,您应将其传递给存储命令。有关 PresentedFile 类的所有构造函数参数,请阅读类实现。

为了完成存储,请阅读以下内容

<?php

$presentedFile = new \Reshadman\FileSecretary\Application\PresentedFile(
    'file_manager_private', // context name
    'SOME_TEXT_CONTENT_HERE_', // The mime type will be detected automatically.
    \Reshadman\FileSecretary\Application\PresentedFile::FILE_TYPE_CONTENT
);

/** @var \Reshadman\FileSecretary\Application\Usecases\StoreFile $storeCommand */
$storeCommand = app(\Reshadman\FileSecretary\Application\Usecases\StoreFile::class);

$addressableRemoteFile = $storeCommand->execute($presentedFile);

dd($addressableRemoteFile->fullRelative(), $addressableRemoteFile->fullUrl());

带有文件路径的存储文件

如果您有本地文件路径,可以创建PresentedFile实例,如下所示

<?php

$presentedFile = new \Reshadman\FileSecretary\Application\PresentedFile(
    'file_manager_private', // context name
    $path = '../path_to/my_file.png',
    \Reshadman\FileSecretary\Application\PresentedFile::FILE_TYPE_PATH,
    basename($path)  
);

带有文件内容的存储文件

如果您有文件内容,可以创建PresentedFile实例,如下所示

<?php

$presentedFile = new \Reshadman\FileSecretary\Application\PresentedFile(
    'file_manager_private', // context name
    file_get_contents($path = '../path_to/my_file.png'), // The mime type will be detected automatically.
    \Reshadman\FileSecretary\Application\PresentedFile::FILE_TYPE_CONTENT
);

带有文件实例的存储文件

如果您想从UploadedFile实例或Symfony文件实例存储文件,请阅读以下内容

<?php

$presentedFile = new \Reshadman\FileSecretary\Application\PresentedFile(
    'file_manager_private', // context name
    request()->file('company_logo'), // The mime type will be detected automatically.
    \Reshadman\FileSecretary\Application\PresentedFile::FILE_TYPE_INSTANCE
);

带有文件HTTP URL的存储文件

如果您想从URL存储文件,请阅读以下内容

<?php

$presentedFile = new \Reshadman\FileSecretary\Application\PresentedFile(
    'file_manager_private', // context name
    'https://logo_url.com/logo.png', // The mime type will be detected automatically.
    \Reshadman\FileSecretary\Application\PresentedFile::FILE_TYPE_URL
);

带有base64编码内容的存储文件

如果您想从base64字符串存储文件,请阅读以下内容

<?php

$presentedFile = new \Reshadman\FileSecretary\Application\PresentedFile(
    'file_manager_private', // context name
    'base64encodecontent=', // The mime type will be detected automatically.
    \Reshadman\FileSecretary\Application\PresentedFile::FILE_TYPE_BASE64
);

请注意,如果字符串附加了其他元数据,则应由您移除,MIME类型将自动检测。

存储文件响应

执行存储文件命令后,将返回一个实例

<?php
\Reshadman\FileSecretary\Application\AddressableRemoteFile::class;

要了解方法,请阅读类实现。

存储图片

存储图片与存储文件没有区别。您只需将具有image类别的context_name传递给PresentedFile实例。

new PresentedFile( 'context_name', '/path/to/file', PresentedFile::FILE_TYPE_PATH, "optional_original_file_name.pdf" );

删除文件

要删除文件,您应使用以下服务命令

<?php

/** @var \Reshadman\FileSecretary\Application\Usecases\DeleteFile $deleter */
$deleter = app(\Reshadman\FileSecretary\Application\Usecases\DeleteFile::class);

$fileFullRelativePath = '/context_folder/unique-id.pdf';

$deleter->execute("context_name", $fileFullRelativePath);

如果您正在删除存储模板的图像上下文,则将被删除的图像也会被删除。

更新文件

在处理云文件存储时,其中一些提供CDN服务,更新文件不是一个好主意,您可以简单地删除旧的文件并创建一个新的文件,这是因为CDN提供商需要一些时间来获取所有边缘的新版本。并且由于我们在实现中不关注文件名,因此最好将文件留在存储中,或添加一个X-DELETE-AFTER头,或完全删除它并创建一个新的文件。如果您有某些原因需要此功能,请创建PR或打开问题。

请注意,如果您实现自己的更新策略,请不要使用内置的文件名生成器函数,因为文件名基于文件内容,所以如果您更改文件内容并使用相同的文件名,则在将旧文件上传到上下文时,它将被覆盖。

处理图像

在您创建了具有categoryimage的上下文后,文件-secretary允许您根据图像模板操作和变异图像,您在配置文件中定义图像模板,当通过URL请求预定义参数的图像时,主父图像将从磁盘存储中获取,图像内容传递给模板对象,并将模板的结果提供给用户。

图像模板为所有image上下文定义。

图像模板

要定义您的图像模板,您应将配置添加到配置文件的available_image_templates

<?php return [
  'companies_logo_200x200' => [
    'class' => \Reshadman\FileSecretary\Infrastructure\Images\Templates\DynamicResizableTemplate::class,
    'args' => [
      'width' => 200,
      'height' => 200,
      'encodings' => null, // When null only parent file encoding is allowed.
      'strip' =>  false, // removes the ICC profile when imagick is used.
    ],
  ],  
];

使用动态通用模板

通过使用以下类作为图像模板配置的class参数,您可以使用args控制行为,这将覆盖您的大部分需求

<?php 
\Reshadman\FileSecretary\Infrastructure\Images\Templates\DynamicResizableTemplate::class

class参数是模板实现,每个模板可以有一些参数,DynamicResiableTemplate有一些参数,允许您满足大部分需求。

用于调整大小

  • 宽度:可以是null或整数,如果是null,将自动计算
  • 高度:可以是null或整数,如果是null,将自动计算
  • 编码:可以是null或图像扩展名数组,如['png', 'jpg', 'svg'],如果是null,将使用与父图像相同的编码。
  • 质量:取1到100的整数
  • strip:当设置为true且使用imagick时,可以移除图像中嵌入的ICC配置文件,这可以显著减小生成的图像大小。ICC配置文件用于在不同显示器上生成相同的真实颜色。
  • mode:您可以使用不同的适配策略,请查看模板管理器类(```TemplateManager```)以获取可用适配策略的列表。

编写自己的模板

file-secretary使用intervention包进行图像处理。要编写自己的模板,您应该创建一个实现以下接口的类

<?php
\Reshadman\FileSecretary\Infrastructure\Images\TemplateInterface::class;

然后您可以在配置中使用它,您还可以查看DynamicResiableTemplate实现以更快地理解。

存储处理后的图像

通过某些URL请求处理后的图像,如果例如您在eloquent中将profile_image附加到users模型,则该URL将自动由该包生成。

该URL携带以下信息

  • 上下文名称
  • 上下文文件夹
  • 主图像文件夹
  • 请求的图像模板
  • 请求的图像扩展名

端点从请求中检索上述信息并创建以下对象

<?php

\Reshadman\FileSecretary\Application\PrivacyCheckNeeds::class;

该对象包含获取父图像、处理它、存储它和提供处理后的图像所需的所有信息。

图像处理完毕后,上下文配置指定是否将处理后的图像存储在云中、忽略它或在其他地方(例如更便宜的磁盘)中存储,所有这些都可以通过设置上下文配置数组的store_manipulated值来定义。

store_manipulated有3个可用值

  1. false:它不会存储处理后的图像。
  2. true:存储在处理后的图像旁边。
  3. another_context_name:目标上下文应该是类型ContextCategoryTypes::TYPE_MANIPULATED_IMAGE,因此父文件(例如)存储在Amazon S3上,所有处理后的图像都存储在您的FTP服务器上,该服务器由Nginx代理包装。这允许在图像创建后不参与PHP即可提供处理后的图像,并且由于它们不是唯一的数据源,因此意外删除时不会发生任何事情。

有关此选项的更多信息,请阅读默认配置文件中的contexts部分。

存储Eloquent跟踪的文件

如果您的领域模型(例如您的User模型)有一些blob文件,例如用户的头像,file-secretary提供了一种集中式文件模型,该模型跟踪您的云文件。

因此,在您将文件上传到适当的上下文之后,您可以为该文件创建一个跟踪记录,并通过外键将其附加到用户的模型上。

您还应该包括包迁移以创建数据库表。

何时使用跟踪文件

您需要将云文件附加到eloquent业务模型时,

  • 您的博客文章中有些图像需要缩略图调整大小。
  • 您的用户有一些文件
  • 等等。

eloquent模型有一些getter方法,这些方法可以自动生成图像模板URL和文件URL。

有关更多信息,请查看包的导出迁移。

存储简单文件和可处理图像

存储文件的过程与在云中存储文件没有区别,

您创建一个PresentedFile实例并将其传递给以下服务,返回创建的记录

<?php

$presentedFile = new \Reshadman\FileSecretary\Application\PresentedFile(
    'user_images_context',
    request()->file('avatar_file'),
    \Reshadman\FileSecretary\Application\PresentedFile::FILE_TYPE_INSTANCE,
    basename(request()->file('avatar_file')) // Is stored in the table so you can show the client's name if needed.
);

/** @var \Reshadman\FileSecretary\Application\Usecases\StoreTrackedFile $storeTrackedFile */
$storeTrackedFile = app(\Reshadman\FileSecretary\Application\Usecases\StoreTrackedFile::class);

$trackedModel = $storeTrackedFile->execute($presentedFile);

auth()->user()->avatar()->attach($trackedModel);

dump($trackedModel->full_url);

echo "<img src='{$trackedModel->image_templates['avatar_50x50']}' title='{$trackedModel->original_name}'/>";

使用自己的模型

默认情况下使用以下实现

<?php
\Reshadman\FileSecretary\Application\EloquentPersistedFile::class;

您可以扩展上述类并创建自己的实现

<?php return [
    // Other file_secretary.php config elements
    'eloquent' => [
        'model' => '\YourOwnModel\Class',
        'table' => 'defined_table_in_model_or_this_string_in_fallback'
    ]  
];

删除Eloquent跟踪的文件

当您删除跟踪记录时,包不会从云中删除文件,这是为了防止意外行为。

您可以通过以下服务手动删除文件

<?php

/** @var \Reshadman\FileSecretary\Application\EloquentPersistedFile $trackedFile */
$trackedFile = auth()->user()->avatar;

/** @var \Reshadman\FileSecretary\Application\Usecases\DeleteTrackedFile $deleter */
$deleter = app(\Reshadman\FileSecretary\Application\Usecases\DeleteTrackedFile::class);

$deleter->execute($trackedFile);

// You can also delete a file by uuid
$deleter->execute($trackedFile->getFileableUuid());

处理删除时发生的情况

调用删除服务时,有3种策略

  • 忽略删除远程文件
  • 严格删除远程文件
  • 如果文件的当前唯一ID在相同上下文中不存在,则删除

要指示此操作,您应按以下方式执行服务

<?php

use Reshadman\FileSecretary\Application\Usecases\DeleteTrackedFile;

/** @var \Reshadman\FileSecretary\Application\EloquentPersistedFile $trackedFile */
$trackedFile = auth()->user()->avatar;

/** @var \Reshadman\FileSecretary\Application\Usecases\DeleteTrackedFile $deleter */
$deleter = app(\Reshadman\FileSecretary\Application\Usecases\DeleteTrackedFile::class);

$deleter->execute($trackedFile, DeleteTrackedFile::ON_DELETE_DELETE_REMOTE);

$deleter->execute($trackedFile, DeleteTrackedFile::ON_DELETE_IGNORE_REMOTE);

$deleter->execute($trackedFile, DeleteTrackedFile::ON_DELETE_DELETE_IF_NOT_IN_OTHERS);

提供文件

此包根据您在contexts部分和available_image_templates部分中提供的配置,为您处理文件服务。

但您可以按自己的满意方式提供文件。例如,如果只有管理员可以查看某些文档文件,您可以创建一个路由来检查当前用户是否为管理员,然后从请求参数中检索文件ID,并将其提供给用户

<?php

use Reshadman\FileSecretary\Application\EloquentPersistedFile;
use Reshadman\FileSecretary\Infrastructure\FileSecretaryManager;

class SomeController extends \Illuminate\Routing\Controller {
    
    public function getDocument($fileId, FileSecretaryManager $fManager)
    {
        if (!auth()->user()->is_admin) {
            abort(403);
        }
        
        /** @var EloquentPersistedFile $trackedFile */
        $trackedFile = EloquentPersistedFile::findOrFail($fileId);
        
        $diskDriver = $fManager->getContextDriver($trackedFile->getFileableContext());
        
        $path = $trackedFile->full_relative_path;
        
        $contents = $diskDriver->get($path);
        
        if ($contents === false) {
            abort(404);
        }
        
        $headers = ['Content-Type' => $diskDriver->mimeType($path)];
        
        return response($contents, 200, $headers);
    }
    
}

如果您为 contexts 提供了 driver_base_address,则生成的 URL 将以 prepended base_address 开头。如果您的文件是公开的,您只需定义磁盘的 driver_base_address,然后它们将直接从磁盘 HTTP 端点提供。

默认路由

文件秘书提供了一个预定义的路由

<?php

route('file-secretary.get.download_file', [
    'context_name' => '',
    'context_folder' => '',
    'after_context_path'
]);

此路由处理除asset contexts之外的所有 contexts 的文件服务。

如果您不希望这些路由包含在您的包中,请通过在配置中将键设置为false来禁用它。

<?php return [
    // Other config elements
    'load_routes' => false  
];

有一个默认控制器,您可以使用它将路由附加到您的路由

<?php

\Reshadman\FileSecretary\Presentation\Http\Actions\DownloadFileAction::class;

如果使用默认控制器和自己的路由,包中包含了一个中间件,该中间件会获取从云中检索文件所需的数据,这个中间件应该被包裹在路由周围

<?php

\Reshadman\FileSecretary\Presentation\Http\Middleware\PrivacyCheckMiddleware::class;

限制访问

您可以通过在配置中定义隐私类来决定给定用户是否允许查看请求的文件,请根据文档读取配置文件。

文件标识符传递到您的隐私类中,然后您可以决定用户是否允许获取此文件。

所有隐私类都应该实现以下接口

<?php

\Reshadman\FileSecretary\Application\Privacy\PrivacyInterface::class;

此限制仅在您使用内置控制器类进行服务时才有效。

操纵头部信息

您可以使用数组管道来操纵服务时响应的头部。每个数组项应该是以下实现的实例

<?php
\Reshadman\FileSecretary\Presentation\Http\HeadersMutatorInterface::class;

头部数组传递给配置中定义的每个头部修改器项。

有关如何使用的详细信息,请参阅配置文件的public_images部分。

提供公共文件和可操作图像

如果您有公开的 contexts,您可以使用 driver_base_address 功能来移除 PHP 的参与

对于basic_file上下文类别,基本地址将添加到相对路径的开头,并将其直接提供。

在不参与PHP的情况下提供图像

对于image上下文类别,主图像始终从基本地址提供,但是图像模板仍然从 PHP 提供,您可以创建一个 Nginx 反向代理,执行以下操作之一

  • store_manipulated 设置为 true,创建一个 Nginx 指令,当基本地址发生文件未找到时调用 laravel 端点,laravel 端点将文件存储在主文件旁边,因此在下一次调用中,图像将从您的上游基本地址提供。

  • store_manipulated 设置为 false 使用带有缓存的反向代理,该代理调用 laravel 端点,在成功调用后,Nginx 将缓存图像,因此图像将从 Nginx 的缓存提供。

  • store_manipulated 设置为另一个使用本地磁盘的上下文,将磁盘路径设置为 Nginx 的根,在 404 时调用 laravel 端点,或者使路由路径和磁盘路径看起来相同,因此当文件不存在时,它将自动路由到生成器控制器。

将很快添加 Nginx 指令,以使其更加简单。

辅助函数

将很快添加。

Nginx指令和生产注意事项

将很快添加。

运行集成测试

为此包编写了集成测试。要运行集成测试,请按照以下步骤操作

  1. 根据包的 phpunit.dist.xml 创建您的 phpunit.xml 文件:cp phpunit.dist.xml phpunit.xml

  2. 请使用环境变量填充phpunit配置。该软件包已通过Rackspace对象存储进行测试,以证明其在云中的功能。您可以修改phpunit.xml文件和fixtures/config/中的配置,以将其集成到您的测试环境中。

  3. 使用vendor/bin/phpunit --debug运行测试

目前,该软件包没有独立的对象单元测试。它们将在下一个版本中添加。

软件包路线图

  1. 编写更多集成测试和独立的对象单元测试。
  2. 使用更具语义的特征、类名和方法名。
  3. 使跟踪和eloquent独立。
  4. 对代码进行重构,以提高设计和性能。
  5. 在新的版本中,使用一个多态模型来跟踪数据库文件,该模型允许指示文件是否在其他模型中被使用过(由设计)。这最终可以删除未使用的跟踪文件。这仅在SQL数据库中有效。
  6. 添加Nginx指令
  7. 将一些工作委托给工作队列。

关于该软件包

此软件包是从jobinja.ir - 伊朗领先的职位板和职业平台提取的,这是制作jobinja.ir12factor.net兼容性的工作的一部分。

许可证

MIT许可证(MIT)。请参阅许可证文件以获取更多信息。