将控制器类方法中的一些代码包装起来,因为它太长了,并将这些代码放在控制器类下面的另一个自定义函数中,这是一个很好的做法吗。
以下是控制器方法:
public function store(UploadRequest $request)
{
//Provjera duljine imena slike (max 20 znakova)
if(!is_valid_name($request->file('file'))) {
return redirect()->back()->withErrors(['File name can't be longer than 20 characters.']);
}
$user = Auth::user();
$time = time();
$image = $request->file('file');
//Dodaj trenutno vrijeme prije imena slike kako bi se slika mogla identificirati
$image_name = $time . $image->getClientOriginalName();
//Ako je slika png spremi ju bez konverzije
if($image->getClientOriginalExtension() == "png")
{
Storage::put('public/images/'.$user->id.'/png/'.$image_name, file_get_contents($image));
save_image_to_database($image, $user, $time);
}
Save_image_to_database((是我的自定义函数,它写在控制器类下面
function save_image_to_database($image, $user, $time){
$db_image = new Image();
if($image->extension() == 'png')
{
$db_image->path = $time . $image->getClientOriginalName();
$db_image->png_size = $image->getClientOriginalSize();
}
else
{
$path = $time . pathinfo($image->getClientOriginalName(), PATHINFO_FILENAME).'.png';
$png_size = Storage::size('/public/images/'.$user->id.'/png/'.$path);
$db_image->path = $path;
$db_image->png_size = $png_size;
}
$db_image->user_id = $user->id;
$db_image->extension = $image->extension();
$db_image->size = $image->getClientSize();
$db_image->save();
return redirect('/images');
}
问题是自定义函数中的重定向((方法不起作用,它重定向到空白窗口,但浏览器"localhost:8000/images"中的路径是正确的。当我手动刷新网站时,它会工作,并返回视图。如果我将重定向((方法从自定义函数移到控制器存储((,那么它工作得很好
您的函数返回Response
对象,但控制器不使用它
对你来说,最简单的解决方案是返回像这样的助手函数的响应
return save_image_to_database($image, $user, $time);
然而,我至少会把它包装在try-catch
中,以处理无法像一样保存文件的问题
try {
save_image_to_database($image, $user, $time);
} catch (Exception $e) {
// return error response
}
// if we got here image was successfully saved
return redirect('/images');
现在回到您的问题,将图像作为另一种控制器方法处理是否是一种良好的体验。。我想说不,你想让你的控制器非常瘦,并且只有Router
使用的方法
我要么把它移到Trait
(PHP中的特征(中,并在控制器中使用该特征,要么制作一个Image Service
,并通过依赖注入使用它。