Redirection in laravel without return statement

后端 未结 3 1898
伪装坚强ぢ
伪装坚强ぢ 2021-02-06 03:47

i have this blogsController, the create function is as follows.

public function create() {
  if($this->reqLogin()) return $this->reqLogin();
  return View:         


        
3条回答
  •  陌清茗
    陌清茗 (楼主)
    2021-02-06 04:19

    Beside organizing your code to fit better Laravel's architecture, there's a little trick you can use when returning a response is not possible and a redirect is absolutely needed.

    The trick is to call \App::abort() and pass the approriate code and headers. This will work in most of the circumstances (excluding, notably, blade views and __toString() methods.

    Here's a simple function that will work everywhere, no matter what, while still keeping your shutdown logic intact.

    /**
     * Redirect the user no matter what. No need to use a return
     * statement. Also avoids the trap put in place by the Blade Compiler.
     *
     * @param string $url
     * @param int $code http code for the redirect (should be 302 or 301)
     */
    function redirect_now($url, $code = 302)
    {
        try {
            \App::abort($code, '', ['Location' => $url]);
        } catch (\Exception $exception) {
            // the blade compiler catches exceptions and rethrows them
            // as ErrorExceptions :(
            //
            // also the __toString() magic method cannot throw exceptions
            // in that case also we need to manually call the exception
            // handler
            $previousErrorHandler = set_exception_handler(function () {
            });
            restore_error_handler();
            call_user_func($previousErrorHandler, $exception);
            die;
        }
    }
    

    Usage in PHP:

    redirect_now('/');
    

    Usage in Blade:

    {{ redirect_now('/') }}
    

提交回复
热议问题