بسیاری از مواقع قصد داریم همزمان با حذف کردن یک رکورد، فایلهای مربوط به آن رکورد را نیز حذف نماییم. حال ممکن است چندین و چند فایل مربوط به یک رکورد در دایرکتوری مورد نظر وجود داشته باشند.
با این فرض که دایرکتوری و فایلهای من در public قرار داشته باشند، به صورت زیر در کنترلر خود عمل میکنم:
نکته: توجه داشته باشید این مورد صرفاً یک سمپل است و شما میتوانید آن را بسیار بهتر بنویسید.
سناریو: ابتدا دایرکتوری یک رکورد تشخیص داده میشود و در صورتی که در دایرکتوری مربوطه فایلهایی وجود داشته باشند، تمامشان حذف و سپس خود دایرکتوری حذف و بعد از آن هم رکورد مربوطه حذف خواهد شد. اما در صورتی که دایرکتوری وجود نداشته باشد، رکورد حذف خواهد شد.
public function destroy(User $user)
{
try {
$url = explode('/', $user->image1); //پیدا کردن مسیر دایرکتوری از یکی از فایلها
array_pop($url); //بیرون انداختن قسمت آخر
$folderPath = 'doc_files/' . implode('/', $url); //تشکیل مسیر دایرکتوری روی سرور
if (is_dir($folderPath)) {
$files = glob("$folderPath/*"); //دریافت تمام فایلهای داخل دایرکتوری در صورت وجود
//حذف تمام فایلهای داخل دایرکتوری
foreach ($files as $file) {
if (is_file($file)) {
unlink($file); //delete file
}
}
rmdir($folderPath); //حذف دایرکتوری
User::destroy($user->id);
return redirect('/administrator/requests/pending')->with('success', 'حذف با موفقیت انجام شد');
}
User::destroy($user->id);
return redirect('/administrator/requests/pending')->with('error', 'فایل و پوشه مورد نظر یافت نشد');
} catch (QueryException $ex) {
dd($ex->getMessage());
}
}
تمام موارد لازم را نیز به صورت فارسی کامنتگذاری کردهام تا ابهامی رخ ندهد.