emsifa/ random-image
将Unsplash中的随机图片存储到您的Laravel应用中
Requires
- php: ^8.1
- illuminate/contracts: ^10.0
- intervention/image: ^2.7
- spatie/laravel-package-tools: ^1.13.0
Requires (Dev)
- guzzlehttp/guzzle: ^7.5
- laravel/pint: ^1.0
- nunomaduro/collision: ^6.0
- nunomaduro/larastan: ^2.0.1
- orchestra/testbench: ^8.0
- pestphp/pest: ^1.21
- pestphp/pest-plugin-laravel: ^1.4
- phpstan/extension-installer: ^1.1
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-phpunit: ^1.0
- phpunit/phpunit: ^9.5
README
Random Image是一个Laravel助手,用于获取随机图片并将其存储在您的应用中。它设计用于在模型工厂中使用,以生成示例数据。
目前我们有3个随机图片提供者可供选择
- LoremFlickr(默认)
- Unsplash
- LoremPicsum(不支持搜索查询)
请查看它们的网站以获取许可证信息。
功能
- 支持搜索词的随机图片URL获取。
- 将随机图片存储到文件系统中。
- 操作下载的图片。
- 复制下载的图片并进行操作(用于缩略图/占位图生成)。
安装
您可以通过Composer安装此包
composer require emsifa/random-image --dev
如果您计划在生产环境中使用此库,请移除
--dev
标志
之后,您可能想使用以下命令发布配置文件
php artisan vendor:publish --tag="random-image-config"
它将在您的项目目录中生成config/random-image.php
文件。
使用示例
获取随机图片URL
如果您只想从提供者获取图片URL,可以使用如下示例中的url
方法
use Emsifa\RandomImage\RandomImage; RandomImage::make()->url();
它将返回https://loremflickr.com/600/400/
,如果您将其用于<img/>
标签,则会显示不同的图片。
您也可以在make
方法中指定大小和搜索词,如下所示
RandomImage::make(200)->url(); // "https://loremflickr.com/200/200/" RandomImage::make(300, 200)->url(); // "https://loremflickr.com/300/200/" RandomImage::make(300, 200, 'cat,dog')->url(); // "https://loremflickr.com/300/200/cat,dog" RandomImage::make(query: 'cats')->url(); // "https://loremflickr.com/600/400/cats"
返回的URL对于每个提供者都是不同的。例如,如果您使用Unsplash提供者,生成的URL将如下所示
RandomImage::make(200)->url(); // "https://source.unsplash.com/random/200x200/" RandomImage::make(300, 200)->url(); // "https://source.unsplash.com/random/300x200/" RandomImage::make(300, 200, 'cat,dog')->url(); // "https://source.unsplash.com/random/300x200/?cat,dog" RandomImage::make(query: 'cats')->url(); // "https://source.unsplash.com/random/?cats"
您可以在
config/random-image.php
文件中更改提供者。
存储图片
您可以使用store
或storeAs
方法将图片下载并存储到您的文件系统磁盘。
RandomImage::make()->store(); // "{random-hash-name}.jpg" RandomImage::make()->store('images'); // "images/{random-hash-name}.jpg"
您可以通过定义disk
参数来指定磁盘
RandomImage::make()->store('images', 's3'); // "images/{random-hash-name}.jpg" RandomImage::make()->store(disk: 's3'); // "{random-hash-name}.jpg"
如果想要指定文件名,请使用storeAs
RandomImage::make()->storeAs('', 'my-image.jpg'); // "my-image.jpg" RandomImage::make()->storeAs('images', 'my-image.jpg'); // "images/my-image.jpg"
您也可以通过使用url()
方法来获取存储的URL,如下例所示
RandomImage::make()->store()->url(); // "http://your-app.test/storage/{random-hash-name}.jpg" RandomImage::make()->store('images')->url(); // "http://your-app.test/storage/images/{random-hash-name}.jpg" RandomImage::make()->storeAs('', 'my-image.jpg')->url(); // "http://your-app.test/storage/my-image.jpg" RandomImage::make()->storeAs('images', 'my-image.jpg')->url(); // "http://your-app.test/storage/images/my-image.jpg"
或者,如果您只想获取文件名,可以通过使用name()
方法来获取。
RandomImage::make()->store()->name(); // "{random-hash-name}.jpg" RandomImage::make()->store('images')->name(); // "{random-hash-name}.jpg" RandomImage::make()->storeAs('', 'my-image.jpg')->name(); // "my-image.jpg" RandomImage::make()->storeAs('images', 'my-image.jpg')->name(); // "my-image.jpg"
在模型工厂中的使用示例
此包设计用于在模型工厂中使用,因此上述方法返回的是图片路径/URL字符串,您可以直接将其存储在数据库中。要在模型工厂中使用它,您可以在模型工厂中像以下示例那样调用上述方法
<?php namespace Database\Factories; use Illuminate\Database\Eloquent\Factories\Factory; use Emsifa\RandomImage\RandomImage; /** * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Post> */ class PostFactory extends Factory { /** * Define the model's default state. * * @return array<string, mixed> */ public function definition() { return [ 'title' => $this->faker->words(5, true), 'body' => $this->faker->paragraphs(5, true), 'image' => RandomImage::make(600, 400)->store('posts', 'public'), ]; } }
当您使用上述工厂种子帖子数据时,您可以使用Storage::disk('public')->url($post->image)
来获取URL。
复制并操作下载的图片
在大多数情况下,您可能想创建同一图片的缩略图版本。我们使用intervention/image的一些API来实现这一点。
例如,在上述帖子工厂中,我们想要定义包含图片300x200像素版本路径的thumbnail
字段
public function definition() { $image = RandomImage::make(600, 400)->store('posts', 'public'); $thumbnail = $image->copy()->fit(300, 200); // Resize to 300x200px and make it greyscale // $thumbnail = $image->copy()->fit(300, 200)->greyscale(); // Use copyAs if you want to specify filename // $thumbnail = $image->copyAs('posts', 'my-thumb.jpg')->fit(300, 200); return [ 'title' => $this->faker->words(5, true), 'body' => $this->faker->paragraphs(5, true), 'image' => $image, 'thumbnail' => $thumbnail, ]; }
NEW: 您可以使用previous
方法来完成与上述示例相同的事情,但更简单。
public function definition() { return [ 'title' => $this->faker->words(5, true), 'body' => $this->faker->paragraphs(5, true), 'image' => RandomImage::make(600, 400)->store('posts', 'public'), 'thumbnail' => RandomImage::previous()->copy()->fit(300, 200), ]; }
以下是可以使用的操作方法列表
resize(width, height)
:根据给定的宽度和/或高度调整当前图片的大小。(intervention文档)crop(width, height, x, y)
:根据给定的宽度和高度,从当前图像中裁剪出矩形部分。(intervention 文档)fit(width, height)
:结合裁剪和调整大小,以智能方式格式化图像。(intervention 文档)widen(width)
:将当前图像调整到新宽度,同时约束宽高比。(intervention 文档)heighten(height)
:将当前图像调整到新高度,同时约束宽高比。(intervention 文档)greyscale()
:将图像转换为灰度版本。(intervention 文档)。grayscale()
:greyscale 的别名。blur()
:在当前图像上应用可选量的高斯模糊滤镜。(intervention 文档)
上述所有方法都可在从
store
方法返回的ImageResult
实例上使用。因此,您不仅可以用于复制图像,还可以用于原始存储的图像。
测试
composer test
变更日志
请参阅 CHANGELOG 了解最近更改的更多信息。
安全漏洞
请查看 我们的安全策略 了解如何报告安全漏洞。
鸣谢
- Muhammad Syifa(创建者)
- LoremFlickr(图像提供者)
- Unsplash(图像提供者)
- Lorem Picsum(图像提供者)
- Spatie(包骨架)
- 所有贡献者
许可协议
MIT 许可协议(MIT)。请参阅 许可文件 了解更多信息。