emsifa/random-image

将Unsplash中的随机图片存储到您的Laravel应用中

v1.0.0 2023-02-18 09:48 UTC

README

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

Random Image是一个Laravel助手,用于获取随机图片并将其存储在您的应用中。它设计用于在模型工厂中使用,以生成示例数据。

目前我们有3个随机图片提供者可供选择

  1. LoremFlickr(默认)
  2. Unsplash
  3. 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文件中更改提供者。

存储图片

您可以使用storestoreAs方法将图片下载并存储到您的文件系统磁盘。

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 了解最近更改的更多信息。

安全漏洞

请查看 我们的安全策略 了解如何报告安全漏洞。

鸣谢

许可协议

MIT 许可协议(MIT)。请参阅 许可文件 了解更多信息。