代码之家  ›  专栏  ›  技术社区  ›  KalC

事务块内的Laravel 5.1重定向

  •  3
  • KalC  · 技术社区  · 8 年前

    我在我的Laravel 5.1应用程序中有一组delete语句,我已经将它们放入了一个事务中。

    我有如下代码,并试图返回到同一页。但我得到了 空白页 .我的路线。php很好。

    DB::transaction(function () use ($foo, $bar, $request)  
    {   
        // Delete from table abc
        $deletedFoo = DB::delete('delete from abc where id = ' .  $foo);
    
        // Delete from table xyz
        $deletedBar = DB::delete('delete from xyz where id = ' .  $bar);
    
        // Shows blank page
        $request->session()->flash('changes_saved', 'Success! All your changes were saved.');
        return back();
    
    });
    

    但是,如果我将返回标准放在DB::事务块之外,它就可以正常工作。

    DB::transaction(function () use ($foo, $bar)    
    {   
        // Delete from table abc
        $deletedFoo = DB::delete('delete from abc where id = ' .  $foo);
    
        // Delete from table xyz
        $deletedBar = DB::delete('delete from xyz where id = ' .  $bar);
    });
    
    // Goes back to the page with the message
    $request->session()->flash('changes_saved', 'Success! All your changes were saved.');
    return back();
    

    在我意识到需要将重定向放在事务之外之前,我尝试了各种方法。但为什么?我是拉拉维勒的新手,在这里有点困惑。

    1 回复  |  直到 8 年前
        1
  •  7
  •   The Alpha    5 年前

    你必须这样使用return:

    return DB::transaction(function () {
        ...
        return back();
    });
    

    为了理解它,让我们破解代码:

    $transaction = function ($foo, $bar, $request)  
    {
        // ...
        return back();
    }
    
    return DB::transaction($transaction); // return is required here
    

    除非你把 DB::transaction 调用控制器类,则不会返回。所以,像这样使用return:

    public function controllerMethod()
    {
        return DB::transaction(...); // You must return
    }
    

    所以,只要把 return 在您的 DB::transaction(...) 。此外,如果您从事务外部控制执行流会更好,例如:

    $result = DB::transaction(function () use ($foo, $bar) {
        // ...
        return true;
    });
    
    if($result === true) {
        return back();
    }