Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel 在控制器类下面的控制器中写入函数?_Laravel_Redirect_Laravel 5.6_Laravel Controller - Fatal编程技术网

Laravel 在控制器类下面的控制器中写入函数?

Laravel 在控制器类下面的控制器中写入函数?,laravel,redirect,laravel-5.6,laravel-controller,Laravel,Redirect,Laravel 5.6,Laravel Controller,从控制器类方法中包装一些代码是一种很好的做法,因为它太长,并将该代码放在控制器类下面的另一个自定义函数中 以下是控制器方法: public function store(UploadRequest $request) { //Provjera duljine imena slike (max 20 znakova) if(!is_valid_name($request->file('file'))) { return redirect()->

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

以下是控制器方法:

    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);
    }
“将图像保存到数据库”是我的自定义函数,写在控制器类下面:

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中的路径是正确的。当我手动刷新站点时,它会起作用并返回视图。若我将重定向方法从自定义函数移动到控制器存储,那个么它运行良好。

您的函数返回响应对象,但控制器不使用它

最简单的解决方案是返回helper函数的响应,如

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');
现在回到您的问题,关于将图像作为另一种控制器方法处理是否是一种良好的体验。。我会说不,你们想让你们的控制器非常紧凑,并且只有路由器使用的方法


我会将其移动到一个Trait中并在控制器中使用该Trait,或者创建一个图像服务并通过使用它。

您是否应该将save\u Image\u返回到\u数据库?我的意思是使用return save_image_to_database$image,$user,$time;。如果您的控制器函数没有返回视图、重定向、响应等,那么当函数完成时,您将看到一个空白页。它将我重定向到重定向中的/images路由,但会出现空白窗口,如果我刷新它,则会出现视图,然后处理/images路由的任何函数中都有一些逻辑阻止返回;也许为此发布控制器函数?奇怪的是,如果我写那行代码返回重定向“/images”;下面,在控制器方法中调用save_image_to_database函数时,它会工作,但在save_image_to_database方法中,它不会工作。是否使用return save_image_to_database$image,$user,$time;还是不?我很困惑…看看上面的评论;此外,考虑调整您的回答,返回SaveIIMAIGEOToDATA数据库$图像,$用户,$time;你描述了,但不包括在内