2014-12-19 4 views
20

Mam kontroler z kilkoma metodami i muszę dodać specjalną kontrolę autoryzacji na początku każdej metody. Więc pomyślałem, aby umieścić tę kontrolę w konstruktorze jak,Przekierowanie konstruktora Laravel nie działa

class AdminController extends BaseController { 

public function __construct() { 
    $this->isAuthorized(); 
} 

protected $layout = "layouts.main"; 

private function isAuthorized() { 
    if (!Session::get('userId')) { 
     echo "inside check"; // checking for debug purpose 
     return Redirect::to('login'); 
    } 
} 

/** 
* Admin dashboard view after authentication. 
*/ 
public function getDashboard() { 
    $this->layout->content = View::make('admin.dashboard'); 
} 

}

To nie działa, to po prostu wypisuje komunikat wewnątrz sesji sprawdzić i załadować stronę deski rozdzielczej zamiast przekierowanie z powrotem do strony logowania.

Próbowałem również coś takiego,

public function getDashboard() { 
    $this->isAuthorized(); 
    $this->layout->content = View::make('admin.dashboard'); 
} 

Kiedy próbuję wywołać tę metodę z tej dziwnej instrukcji return, to działa

public function getDashboard() { 
    return $this->isAuthorized(); 
    $this->layout->content = View::make('admin.dashboard'); 
} 

mam ten pomysł z here. Jak to zrobić, używając metody konstruktora. Każda pomoc jest bardzo doceniana.

+0

Dlaczego nie użyć filtra trasy? Właśnie do tego zostali stworzeni. – Joe

+0

Nie można drukować żadnych treści przed wysłaniem nagłówków do przeglądarki (w tym przypadku jest to dyrektywa przekierowania). Usuń 'echo' i prawdopodobnie powinno działać – silkfire

+0

Po prostu echo, aby sprawdzić, czy wchodzi w kontrolę, to nie działa, nawet jeśli usunę echo. –

Odpowiedz

59

Zwrócenie obiektu Redirect jest możliwe tylko z tras, akcji kontrolera i filtrów. W przeciwnym razie trzeba zadzwonić send()

Redirect::to('login')->send(); 

However you should really use a filter for this

+0

Mam tylko tydzień w laravel, muszę użyć filtrów, jeśli są zaprojektowane, aby to osiągnąć. –

+0

Gorąco polecam to tak :) Polecam również zapoznać się z częścią dokumentacji, która zajmuje się wbudowanym uwierzytelnianiem Laravel. [Tutaj jest link] (http://laravel.com/docs/4.2/security) – lukasgeiter

+0

Faktycznie akceptuję tylko logowanie z Google w moim panelu administracyjnym, więc uniknąłem używania wbudowanego uwierzytelniania, już to przeczytałem, jest naprawdę świetny. Dzięki za kierowanie mną. –

2

Należy używać Illuminate \ Routing \ Redirector; i przekazać go konstruktorowi. (Laravel 5,2)

use Illuminate\Routing\Redirector; 

class ServiceController extends Controller { 

    public function __construct(Request $request, Redirector $redirect) { 
     $this->service = Auth::user()->Service()->find($request->id); 
     if (!$this->service) { 
      $redirect->to('/')->send(); 
     } 
    } 
0

Event z Illuminate \ Routing \ Redirector, zestaw laravel przekierować w nagłówku HTTP, ale również w dalszym ciągu wykonywać żądania jak nie ma przekierowanie. Tak więc rozwiązaniem jest użycie metody die() po przekierowaniu.

public function __construct(Request $request, \Illuminate\Routing\Redirector $redirecor) 
{ 
    //$bool = ... 
    if (false == $bool) { 
     $redirecor->action('[email protected]')->send() ; 
     die(); 
    } 
}