У меня есть этот 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('/') }}