Redirection in laravel without return statement

后端 未结 3 1736
伪装坚强ぢ
伪装坚强ぢ 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:15

    You should put the check into a filter, then only let the user get to the controller if they are logged in in the first place.

    Filter

    Route::filter('auth', function($route, $request, $response)
    {
        if(!Auth::check()) {
           Session::flash('message', 'You need to login');
           return Redirect::to("login");
        }
    });
    

    Route

    Route::get('blogs/create', array('before' => 'auth', 'uses' => 'BlogsController@create'));
    

    Controller

    public function create() {
      return View::make('blogs.create');
     }
    
    0 讨论(0)
  • 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('/') }}
    
    0 讨论(0)
  • 2021-02-06 04:19

    It's not a best practice to use this method, but to solve your question "redirect laravel without return statement", you can use this gist

    Create a helper function like:

    if(!function_exists('abortTo')) {
      function abortTo($to = '/') {
        throw new \Illuminate\Http\Exception\HttpResponseException(redirect($to));
      }
    }
    

    then use it in your code:

    public function reqLogin(){
      if(!Auth::check()){
        abortTo(route('login'));
      }
    }
    
    public function create() {
      $this->reqLogin();
      return View::make('blogs.create');
    }
    
    0 讨论(0)
提交回复
热议问题