我有一个带有多种方法的控制器,我需要在每个方法的开头添加一个特定的授权检查。所以我想把这个检查放在构造函数中,
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');
}
}
它不起作用,它只是在会话检查中打印消息并加载仪表板页面而不是重定向回登录页面。
我也尝试过这样的事情,
public function getDashboard() {
$this->isAuthorized();
$this->layout->content = View::make('admin.dashboard');
}
当我尝试使用这个奇怪的return语句调用此方法时,它可以正常工作
public function getDashboard() {
return $this->isAuthorized();
$this->layout->content = View::make('admin.dashboard');
}
我从here得到了这个想法。 如何使用构造函数方法实现此目的。非常感谢任何帮助。
答案 0 :(得分:71)
只能从路由,控制器操作和过滤器返回Redirect
来执行它。否则你必须致电send()
Redirect::to('login')->send();
答案 1 :(得分:3)
确保使用Illuminate \ Routing \ Redirector;并将其传递给构造函数。 (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();
}
}
答案 2 :(得分:2)
使用Illuminate \ Routing \ Redirector的事件,laravel在http标头中设置重定向,但也继续执行请求,就像没有重定向一样。所以解决方案是在重定向之后使用die()。
public function __construct(Request $request, \Illuminate\Routing\Redirector $redirecor)
{
//$bool = ...
if (false == $bool) {
$redirecor->action('MyController@myAction')->send() ;
die();
}
}
答案 3 :(得分:0)
使用->send()
redirect()->route('named-route')->send();在Laravel构造函数中插入了
return
return redirect()->route('named-route');。