我有这个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 框架中一样。
答案 0 :(得分:10)
除了组织你的代码以适应更好的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('/') }}
答案 1 :(得分:2)
您应该将支票放入过滤器,然后只有当用户首先登录时才让用户到达控制器。
过滤
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');
}
答案 2 :(得分:0)
使用此方法不是最佳实践,但是要解决“没有返回语句的重定向laravel”问题,可以使用this gist
创建一个类似于以下内容的辅助函数:
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');
}