-1

这是从控制器类方法包装一些代码的好习惯,因为它太长并将该代码放在控制器类下面的另一个自定义函数中。

这是控制器方法:

    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');

}

问题是自定义函数中的 redirect() 方法不起作用,它重定向到空白窗口,但浏览器“localhost:8000/images”中的路径是正确的。当我手动刷新站点时,它可以工作并返回视图。如果我将该 redirect() 方法从自定义函数移动到控制器 store() ,那么它运行良好。

4

1 回答 1

1

您的函数返回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

我要么将它移动到一个TraitPHP 中的 Traits)中并在控制器中使用该 trait,要么通过依赖注入Image Service创建一个并使用它。

于 2018-07-19T16:06:48.937 回答