Перенаправление в laravel без возврата

У меня есть этот blogController, функция create выглядит следующим образом.

public function create() { if($this->reqLogin()) return $this->reqLogin(); return View::make('blogs.create'); } 

В BaseController у меня есть эта функция, которая проверяет, вошел ли пользователь в систему.

  public function reqLogin(){ if(!Auth::check()){ Session::flash('message', 'You need to login'); return Redirect::to("login"); } } 

Этот код работает нормально, но это не то, что нужно, я хочу, чтобы моя функция создания была следующей.

 public function create() { $this->reqLogin(); return View::make('blogs.create'); } 

Могу ли я это сделать?

Кроме того, могу ли я установить правила аутентификации, как мы это делаем в структуре Yii , в верхней части контроллера.

Вы должны поместить чек в фильтр, а затем разрешить пользователю только перейти на контроллер, если они вошли в систему в первую очередь.

Фильтр

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

маршрут

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

контроллер

 public function create() { return View::make('blogs.create'); } 

Помимо организации вашего кода, чтобы он соответствовал лучшей архитектуре Laravel, есть небольшая уловка, которую вы можете использовать, когда возврат ответа невозможен, и перенаправление абсолютно необходимо.

Хитрость заключается в вызове \App::abort() и передаче соответствующего кода и заголовков. Это будет работать в большинстве случаев (исключая, в частности, виды лезвий и методы __toString() .

Вот простая функция, которая будет работать везде , несмотря ни на что, при этом сохраняя логику останова без изменений .

 /** * 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; } } 

Использование в PHP:

 redirect_now('/'); 

Использование в Blade:

 {{ redirect_now('/') }}