我正在使用Lumen构建API,我的应用程序的这个特定部分包含以下关系:
促销活动有很多项目 物品有很多图像
在图片上传中,插入一行,为所提供的图片提供URL。图像上传到public / assets / promotion_ $ id / item_ $ id。
删除某个项目时,其各自的图像文件夹也会被删除。那部分相对容易,可以在我的PromotionController里面完成:
public function delete_item(Request $request)
{
$item = PromotionItems::find($request->input('id'))->toArray();
$img_folder_path = 'assets/promotions/promotion_' . $item['promotion_id'] . '/item_' . $item['id'];
if(is_dir($img_folder_path))
{
$files = array_diff(scandir($img_folder_path), array('.','..'));
foreach ($files as $file)
{
unlink($img_folder_path . '/' . $file);
}
rmdir($img_folder_path);
}
$delete = PromotionItems::destroy($request->input('id'));
return response()->json($delete);
}
这没关系,但是当删除促销时也需要这样做。现在,当删除促销时,会调用一个也删除项目的事件。删除项目时,将调用一个事件,该事件还会删除数据库中的图像行。所以它是一个很好的,整洁的事件链。
但是,如果直接删除项目,它只会删除图像文件夹,这就是为什么我想将此代码放入我的项目模型中的删除事件中:
protected static function boot()
{
parent::boot();
static::deleting(function($item)
{
$item->images()->delete();
});
}
但是,此功能的范围似乎并未扩展到要删除的实际对象。由于图片路径包含ID,因此我需要在项目删除之前访问该项目的属性。
我对Laravel / Lumen / Eloquent比较新,所以任何建议都会受到赞赏。
编辑:我知道技术上可以将我的Promotion控制器中的文件夹删除代码放入其删除功能中,只需调用所有项目并循环浏览它们,删除所有文件夹/文件。但那是多余的代码,我想避免它。
答案 0 :(得分:0)
我发现我无论如何都要在促销删除时删除文件夹,因为我想要删除它的顶级目录。所以我只是在我的控制器中做了一种递归函数:
public function remove_directory($path)
{
if(is_dir($path))
{
$files = array_diff(scandir($path), array('.','..'));
foreach ($files as $file)
{
(is_dir("$path/$file")) ? $this->remove_directory("$path/$file") : unlink($path . '/' . $file);
}
rmdir($path);
}
}
因此,当我从delete_promotion函数调用它时,它会删除促销文件夹及其中的所有文件夹/文件。我只是调用相同的函数,但在delete_item函数的路径上使用/ item_ $ id。