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


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

30.08.2014 02:25:12 Просмотров 6 Источник

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

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 framework, в верхней части контроллера.

У вопроса есть решение - Посмотреть?

Ответы - Перенаправление в laravel без оператора return / Redirection in laravel without return statement

Является ответом!
Laurence

30.08.2014 02:40:32

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

Фильтр

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');
 }
tacone

08.01.2015 01:31:50

Помимо организации вашего кода так, чтобы он лучше соответствовал архитектуре 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('/');

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

{{ redirect_now('/') }}
rmdwirizki

06.09.2020 10:29:22

Это не лучшая практика использовать этот метод, но чтобы решить Ваш вопрос "перенаправить laravel без оператора return", вы можете использовать эту суть

Создайте вспомогательную функцию типа:

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

затем используйте его в своем коде:

public function reqLogin(){
  if(!Auth::check()){
    abortTo(route('login'));
  }
}
public function create() {
  $this->reqLogin();
  return View::make('blogs.create');
}
Помочь в развитии проекта:
Закрыть X