📅  最后修改于: 2023-12-03 15:09:50.961000             🧑  作者: Mango
在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应用程序中的许多场景中使用,例如在社交媒体应用程序中更新个人资料图片时。