记录下自己踩的坑:
在没采用laravel框架时,比较那手的还是tp类的,喜欢把判断登录一类的方法 放在基类继承 然后构造运行下这样的流程..........
但是却在laravel不太适用,经过考察下来的时候 session的类以及助手方法 是laravel框架自己创造的,基层运行 优先级应该是低于构造 导致构造拿不到 记录到file 的session,
那根据这点 我们只能移植到中间件来判断~一下上代码 中间件到底该怎么搞, 我的框架是7的 以此为例:
1:我们先在app/Http/Kernel.php 声明下我们的中间件~
我选择在routeMiddleware 里声明了一个 login_check的中间件 也就是登录验证, 同时我也确定了我在那个明明空间下创建Loginaa这个验证类, 好接下来 我们去创建文件!
<?php
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
'login_check' => \App\Http\Middleware\Loginaa::class
];
2:我们在文件里用has判断了下是否存在session uid里是否有值, 没值会给false 有值则会true, 这时就可以在不登录时把我们访问重定向到登录页这样 接下来看看我们路由方面怎么写的
<?php
namespace App\Http\Middleware;
use Illuminate\Http\Request;
class Loginaa
{
public function handle($request, \Closure $next){
if(session()->has('uid')==false){
//如果不存在时 我们该处理的业务 存在时则不进行处理
// return redirect("/")->send();
}
return $next($request);
}
}
3:路由文件 写在了 默认的 routes目录下的web.php, 此时看到 我们代码先分了组,声明了下这个组 访问的是Home模块,
然后内分组 括起来了某些方法 指定要加载我们写的登录验证中间件
此时 业务已经明朗了, 在访问首页 feedBack 以及 ajax 必须要先经过我们的中间件, 登录那边就不需要括在我们中间件的范围内, 不然会早成死循环跳转
<?php
use Illuminate\Support\Facades\Route;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
//模板类
Route::group(['prefix' => '','namespace' => 'Home'], function (){
Route::middleware('login_check')->group(function(){
//list页面
Route::any('/','IndexController@list');
//反馈也
Route::any('/feedBack','IndexController@feedBack');
//提交保存
Route::any('/ajaxSave','IndexController@ajaxSave');
});
//回跳登录
Route::any('/saveRegisterMessage','LoginController@saveRegisterMessage');
//导出全量csv
//Route::any('/contentDataExport','LoginController@contentDataExport');
});
4:我们声明了路由 最后看我下我们保存session的地方
这是我简单写了一个,我的场景是 微信环境下 封装的回跳机制下的, 可以忽略我的业务代码
最下面我们写入session 有时候啊 save一下 没有错的兄弟们, 在某些场景下(我忘记了),不save的话 session的东西不会落地,
导致你那边永远判断不到 但是你在set值的下面却打印的到,,就很诡异拉, 所以推荐下 set后就 save一下~
<?php
//回跳登录 记录用户
public function saveRegisterMessage(Request $request){
$param = $request->input();
//获取openid
$openID = $request->input("OpenId");
//查询该用户是否存在
$user = DB::table('user')->where(['openid'=>$openID])->first();
$userData = array(
"updated_at" => time(),
"truename" => $request->input("Name"),
"phone" => $request->input("Phone"),
"province" => $request->input("Province"),
"city" => $request->input("City"),
"hospital" => $request->input("Hospital"),
"department" => $request->input("Department"),
"position" => $request->input("Title"),
);
if(empty($user)){
//保存用户信息
$userData["created_at"] = time();
$userData["openid"] = $openID;
$res = DB::table('user')->insertGetId($userData);
if($res){
$userID = $res;
}else{
return '注册失败';
}
}else{
$userID = $user->id;
}
session(['uid'=>$userID]);
session()->save();
return redirect("/");
}
童鞋们 大概就是这个样子~主要还是流程,然后靠自己在手册 以及别人文章中检索自己有用的知识, 多动手实验~