yanmarques / lincable
laravel Eloquent 的存储链接生成器
Requires
- php: >=7.1
- illuminate/contracts: >=5.5.0
- illuminate/http: >=5.5.0
- illuminate/support: >=5.5.0
- league/flysystem: >=1.0
Requires (Dev)
- illuminate/config: >=5.5.0
- illuminate/container: >=5.5.0
- illuminate/database: >=5.5.0
- illuminate/events: >=5.5.0
- illuminate/validation: >=5.5.0
- mockery/mockery: ^1.0@dev
- phpunit/phpunit: ^7.2
This package is not auto-updated.
Last update: 2024-09-20 23:49:08 UTC
README
将 Eloquent 模型链接到上传的文件,将文件存储在存储中,然后在模型中保存 URL。☁️
目录
为什么是它?
lincable 软件包处理文件上传,将文件存储在某些磁盘存储上,并将模型与上传的文件链接起来。整个上传过程,直到文件保存并与模型链接,都得到了良好的配置,以便在所有步骤上为您提供帮助。为模型生成的链接可以具有动态参数,可以隐式注入模型属性,或执行任何自定义逻辑。
基本用法
当处理文件上传时,我们通常期望上传某些数据类型,或者我们需要将 PHP 创建的临时文件移动到正确位置。控制器的操作不应包含文件操作逻辑,但将这些逻辑放在控制器上会使其成为重复代码,因为这类操作通常相同。《FileRequest》类解决了这个问题,将上传逻辑从控制器中移除。当然,该类还携带了验证文件和执行文件保存前事件方法的规则。使用文件请求作为操作参数确保上传了数据类型。
以下是执行上传的操作。
/** * Upload an image to application. * * @param ImageFileRequest $image * @return Response */ public function upload(ImageFileRequest $image) { // The ImageFileRequest contains the current request. $request = $image->getRequest(); // Create the image model on database with request attributes. $image = \App\Image::create($request->all()); // The model uses the lincable trait, which has the link method // that store the file and generate a url for the model. $image->link($image); $image->preview; // https://your-cloud-storage.com/media/foo/123/bar/321/e1wPJQmQpFPOaQ238fglQHnrxzv2uK8joPyozv9i.jpg }
入门
安装
您需要将此软件包作为依赖项添加到项目中,将其添加到 composer.json
文件中。
{ "require-dev": { "yanmarques/lincable": "^0.11.0" } }
或者使用 composer 安装
$ composer require yanmarques/lincable
或者使用 git
$ git clone git@github.com:yanmarques/lincable.git
或者您可以下载二进制文件 发布。
注册服务提供者
您需要将软件包与 Laravel 注册,将服务提供者添加到应用程序提供者中。在 config/app.php
中,将以下内容添加到提供者中
return [ 'providers' => [ ... /* * Package Service Providers... */ Lincable\Providers\MediaManagerServiceProvider::class, ] ]
发布配置
基本上,您必须配置 lincable 文件才能使一切运行良好。在发布服务容器资产后,此配置文件将位于 config/lincable.php
中
$ php artisan vendor:publish --provider="Lincable\Providers\MediaManagerServiceProvider"
现在我们已经将软件包注册到您的环境中,我们需要开始配置 lincable 应如何工作。由于您可以控制如何使用它,因此该软件包非常灵活,没有唯一的方式。
配置模型
eloquent 模型将负责链接文件。链接将由 url 生成器 根据lincable 文件配置生成。在模型中,我们只需添加 lincable 特性 以支持将模型与文件链接起来。假设我们有一个具有 id
和 user_id
属性的图像模型,这两个属性都是 uuid 类型。
use Lincable\Eloquent\Trait\Lincable; class Image extends Model { use Lincable; protected $fillable = ['user_id']; }
一旦我们有了我们的模型,我们需要定义为模型生成的URL。我们必须在config/lincable.php
上设置这些URL。URL列表包含所有模型URL配置。每个模型都有一个URL,默认情况下,这个URL具有动态参数,可以注入模型属性中,有关如何使用默认动态参数的更多详细信息,请参阅解析器和格式化器。例如,我们希望将文件保存到包含user_id
和模型id
的URL中,如下路径:users/user-id-here/ìmages/id-here/
。我们可以使用URL动态参数在URL中注入模型属性。
这里是对config/lincable.php
的配置。
return [ ... 'urls' => [ \App\Image::class => 'users/:user_id/images/:id' ] ];
好的,现在我们创建一个控制器来处理上传。Laravel使用容器依赖注入来解决类、方法、闭包等,注册在路由上的控制器操作也有这个定义。如在基本用法中看到的那样,控制器应该接收文件请求作为参数,这是很好的,因为文件请求必须与当前请求一起启动才能工作,当容器解析文件请求时,它会启动对象。基本用法中的代码确保了文件类型,因为如前所述,作为服务的文件请求必须与当前请求一起启动,这个过程对于用规则验证文件是必要的。一旦文件无效,我们甚至不会执行操作代码。
ImageFileRequest
类继承自处理文件验证和配置的FileRequest
抽象类。当文件请求与当前请求堆栈一起启动时,我们尝试从类名加载已上传的文件,在这种情况下,文件参数将是image
。唯一需要实现的是rules
抽象方法,它返回上传文件的验证规则,有关更多详细信息,请参阅Laravel的验证。
FileRequest
用于上传文件的控制器将处理文件上传并将其存储在云上,并将链接保存到数据库中。文件请求将是一个文件管理器,定义了文件上传的方式以及控制器上传期望的数据类型。这强制执行了文件上传的数据类型和规则,使得通用的文件请求可以与接收相同文件类型的其他控制器一起工作。
/** * Upload a image to application. * * @param \App\FileRequests\ImageFileRequest $image * @return response */ public function upload(ImageFileRequest $image)
在App\FileRequests\ImageFileRequest
类中,我们定义了应用程序中图像上传的规则以及在将文件实际存储在磁盘存储之前要执行的操作。例如,我们希望在存储之前调整图像上传的大小。我们调用intervention图像操作的面具Image
。
use Image; use Lincable\Http\FileRequest; class ImageFileRequest extends FileRequest { protected function rules() { return 'required:jpg,png'; } protected function beforeSend($file) { // The do not need to return a file, because the image has // been saved an the changes will reflect. Image::make($file)->resize(600, 400)->save(); } }
解析器和格式化器
为了允许在URL上使用动态参数,我们必须提供一个解析器类来定义参数如何在URL上表示。没有唯一的方法,你应该创建自己的。默认情况下,我们提供了\Lincable\Parsers\ColonParser
,这是一个以冒号为参数开头的解析器实现,非常简单。解析器仅从URL的部分中提取动态参数,而格式化器实际上执行参数逻辑。默认情况下,我们为冒号解析器添加了一些格式化器。
year
:返回当前年份。month
:返回当前月份。day
:返回当前日期。random
:返回一个32长度的随机字符串。timestamps
:返回哈希过的当前UNIX时间戳。
解析器允许你使用正则表达式模式来分割匹配项,传递参数给格式化器。你也可以向解析器传递一个匿名函数和一个类依赖项,容器将解析类实例。
假设我们希望根据请求中的令牌或id将文件存储在不同的位置。我们可以创建一个格式化器来执行这项任务。
$colonParser->addFormatter(function (Request $request) { if ($request->user()->isBoss()) { return 'boss-location'; } return 'baz'; }, 'customLocation'); $url = 'foo/:customLocation'; // Is user on request is the boss. 'foo/boss-location/dqiojqwdij.zip' // The user on request is not the boss. 'foo/baz/dqiojqwdij.zip';
您还可以在可链接配置中配置一个格式化器类。首先,我们创建格式化器,例如,假设我们想根据API服务创建链接。我们需要一个专门的类来解决这个问题。让我们创建一个模拟的、非功能性的类,该类从客户端API获取请求中当前认证用户的标识。
namespace App\Formatters; ... class GetApiIdFormatter { /** * Attributes initialized here. */ public function __construct(ApiClient $api, Config $params) { $this->api = $api; $this->setConfig($config); // More function tasks. } /** * More complex methods here. */ public function format(Request $request) { return $this->getIdForUser($request->user()); } }
现在我们将格式化器类添加到可链接配置中。现在我们将格式化器添加到默认包解析器ColonParser
中。
return [ ... default_parsers => [ \Lincable\Parsers\ColonParser::class => [ \Lincable\Formatters\YearFormatter::class, \Lincable\Formatters\DayFormatter::class, \Lincable\Formatters\MonthFormatter::class, \Lincable\Formatters\RandomFormatter::class, \Lincable\Formatters\TimestampsFormatter::class, /** * Here we add the formatter */ \App\Formatters\GetApiIdFormatter::class ] ] ];
UrlGenerator
URL生成器根据URL配置编译给定的URL,用于模型实例。
$file->toArray(); // ['id' => 123, 'foo_id' => 321,'preview' => null] $urlConf = new UrlConf; // Create the model url configuration. $urlConf->push(File::class, ':year/:id/:month/:foo_id'); $generator = new UrlGenerator($urlCompiler, $parsers, $urlConf); $preview = $generator->forModel($file)->generate(); // Generate the url for the model from configuration. $preview; // 'https://your-disk-storage.com/2018/123/07/321/HJSxDckZZcMbc8AiWxzlg1Jx2gBVYO6kBqhna6Td.zip'
测试
我们通过测试使世界变得更美好
$ vendor/bin/phpunit
许可证
本项目受MIT许可证的许可 - 有关详细信息,请参阅LICENSE.md文件。