刚开始接触laravel会遇到这样一个问题,我们在判断用户未登录时跳转至登录页面一般都是建一个控制器基类,在基类的构造函数里面进行判断,如果未登录就重定向到登录页
我用tp比较多,在tp控制器的构造函数里面可以直接使用redirect函数进行跳转动作,然而在laravel却不行,这里要提一个东西,那就是中间件,可以很完美的满足我们的需求,当然这篇文章仅供新手参考,大佬勿喷。
首先在app\Middleware目录下新建一个中间件,这里我命名为CheckLogin
namespace App\Http\Middleware;
use Closure;
use Illuminate\Auth\Middleware\Authenticate as Middleware;
class CheckLogin extends Middleware
{
public function handle($request, Closure $next, ...$guards)
{
$response = $next($request);
if(!session('user')){//判断用户未登录就跳转至登录页面
return redirect('login');
}
//如果已登录则执行正常的请求
return $response;
}
}
然后在app/Http/Kernel.php里面的$routeMiddleware数组里面,将刚新建的中间件加进去,别名自己命名。我这里命名的是'check.login'。
新建一个控制器基类,在这个基类的构造函数里面去注册这个中间件。除了登录控制器其他的需要用户登录控制器都继承这个基类,这里我命名为BaseController。
namespace App\Http\Controllers\Index;
use App\Http\Controllers\Controller;
class BaseController extends Controller{
public function __construct()
{
$this->middleware('check.login');//检测登录
}
}
这样请求如果用户未登录就会重定向到登录页面了。
tp里面也是有中间件,用法也基本一样,因为我比较懒再加上可以直接重定向跳所以就没咋用。
PS:2019/10/24今天在研究tp6的时候发现,直接redirect('xxx/xxx')->send()即可,而不是return,由于框架请求流程机制,这种写法注意如果你send后面的代码在跟判断是否登录的条件紧密相连时在send后可能会有报错,因为框架在响应对象的send方法输出后整个请求流程并没有结束,所以如果遇到报错可以在send后强行终止代码运行,如:redirect('xxx/xxx')->send();exit();,但最好是通过修改判断排除这些报错。