📜  当图像更新 laravel 删除删除图像 - PHP (1)

📅  最后修改于: 2023-12-03 15:09:50.961000             🧑  作者: Mango

当图像更新 Laravel 删除删除图像

在Laravel中,更新模型时,如果图像属性也需要更新,我们需要手动删除旧图像。在本文中,我们将学习如何通过使用Laravel事件来实现自动删除旧图像的功能。

环境设置

在开始之前,请确保您已经安装了Laravel,并且已经设置了可以上传文件的存储目录。在本例中,我们将使用Laravel的默认存储驱动程序。

创建事件类

我们需要使用Laravel的事件系统来自动删除旧图像。因此,我们首先需要创建图像更新事件。

php artisan make:event ImageUpdated

ImageUpdated类中,我们将实现逻辑来删除旧图像。在此之前,我们需要将要更新的模型的旧图像路径存储在事件中,以便我们稍后可以使用它来删除图像。

namespace App\Events;

use App\Models\Image;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class ImageUpdated
{
    use Dispatchable, SerializesModels;

    public $updatedImage;
    public $oldImagePath;

    public function __construct(Image $updatedImage, string $oldImagePath)
    {
        $this->updatedImage = $updatedImage;
        $this->oldImagePath = $oldImagePath;
    }
}
创建监听器类

接下来,我们将为我们的事件创建一个监听器类。该类将使用事件中存储的旧图像路径删除旧图像。

php artisan make:listener DeleteOldImage --event=ImageUpdated

DeleteOldImage类中,我们将实现删除旧图像的逻辑。

namespace App\Listeners;

use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Support\Facades\Storage;
use App\Events\ImageUpdated;

class DeleteOldImage
{
    /**
     * Handle the event.
     *
     * @param  \App\Events\ImageUpdated  $event
     * @return void
     */
    public function handle(ImageUpdated $event)
    {
        if ($event->oldImagePath) {
            Storage::disk('public')->delete($event->oldImagePath);
        }
    }
}

我们在此处检查是否有旧图像路径,如果有,则使用Laravel文件系统中的delete方法删除旧图像。

注册事件和监听器

现在,我们需要将我们的事件和监听器注册在Laravel中,以便它们可以在适当的时候被调用。

EventServiceProvider类的boot方法中注册我们的事件和监听器。

protected $listen = [
    \App\Events\ImageUpdated::class => [
        \App\Listeners\DeleteOldImage::class,
    ],
];

这告诉Laravel在ImageUpdated事件被触发时自动调用DeleteOldImage监听器。

触发事件

现在,每当我们更新一个拥有图像属性的模型时,将会触发ImageUpdated事件,并且DeleteOldImage监听器将在后台自动删除旧图像。

以下是在控制器中触发事件的示例代码。

public function update(Request $request, Image $image)
{
    $oldImagePath = $image->path_to_image;
    
    // 更新模型
    $image->update($request->validated());

    event(new ImageUpdated($image, $oldImagePath));
}
结论

在本文中,我们已学习了如何通过使用Laravel事件和监听器来自动删除旧图像。此功能可以在Web应用程序中的许多场景中使用,例如在社交媒体应用程序中更新个人资料图片时。