示例详解Laravel的注册重构


Posted in PHP onAugust 14, 2016

1. 首先确定用户注册的路由

我们在安装好laravel的时候默认生成的注册是用邮箱进行注册的,并且有些选项不需要,有些还需要加一些表单选项

我们注册的话,并不是可以随便注册的,只有一些超级管理员才能进行注册

首先我们使用上次创建的UserController进行配置,如果没有的话,可以使用php artisan make:controller UserController创建一个控制器类

然后创建两条路由Route::get('register', 'UserController@getRegister')Route::post('register', 'UserController@postRegister')

前者是显示一个注册的页面get请求,后面是注册账号的post请求。

2. 显示注册账号页面

这个使用的是getRegister这个方法,这个方法只需要显示一个视图所以并没有特别的逻辑

public function getRegister()
{
 return view('auth.register');
}

3. 请求注册账号

这个使用的是postRegister这个方法

注册账号的话和重置密码一样,而且比注册账号还要简单点。

我们在往数据库里插入一条用户纪录的时候,可以使用User::create($data)进行插入。

$data是个数组,里面存放了每个字段的键和值

public function postRegister(Request $request)
{
 $rules = [
  'username'=>'required|unique:finance_enewsuser',
  'password' => 'required|between:6,20|confirmed'
 ];
 $messages = [
  'required'=>':attribute不能为空',
  'unique'=>'用户名已被注册',
  'between' => '密码必须是6~20位之间',
  'confirmed' => '新密码和确认密码不匹配'
 ];
 $username = $request->input('username');
 $password = $request->input('password');
 $group = $request->input('group');
 $data = $request->all();
 $validator = Validator::make($data, $rules, $messages);
 if ($validator->fails()) {
  return back()->withErrors($validator);
 }
 $data = [
  'username' => $username,
  'password' => bcrypt($password),
  'groupid' => $group,
  'checked' => 0,
  'styleid' => 1,
  'filelevel' => 0,
  'loginnum' => 0,
  'lasttime' => time(),
  'lastip' => '127.0.0.1',
  'truename' => '',
  'email' => '',
  'pretime' => time(),
  'preip' => '127.0.0.1',
 ];
 User::create($data); //插入一条新纪录,并返回保存后的模型实例
 //如果注册后还想立即登录的话,可以使用$user = User::create($data); Auth::login($user); 进行认证
 return redirect('/');
}

4. 完成后的示例

UserController

public function getRegister()
{
 return view('auth.register');
}

public function postRegister(Request $request)
{
 $rules = [
  'username'=>'required|unique:finance_enewsuser',
  'password' => 'required|between:6,20|confirmed'
 ];
 $messages = [
  'required'=>':attribute不能为空',
  'unique'=>'用户名已被注册',
  'between' => '密码必须是6~20位之间',
  'confirmed' => '新密码和确认密码不匹配'
 ];
 $username = $request->input('username');
 $password = $request->input('password');
 $group = $request->input('group');
 $data = $request->all();
 $validator = Validator::make($data, $rules, $messages);
 if ($validator->fails()) {
  return back()->withErrors($validator);
 }
 $data = [
    'username' => $username,
    'password' => bcrypt($password),
    'groupid' => $group,
    'checked' => 0,
    'styleid' => 1,
    'filelevel' => 0,
    'loginnum' => 0,
    'lasttime' => time(),
    'lastip' => '127.0.0.1',
    'truename' => '',
    'email' => '',
    'pretime' => time(),
    'preip' => '127.0.0.1',
   ];
 User::create($data); //插入一条新纪录,并返回保存后的模型实例
 return redirect('/');
}

register.blade

<form class="login-form" action="" method="post">
 {!! csrf_field() !!}
 <h3 class="font-green">Sign Up</h3>
 @if(count($errors) > 0)
  <div class="alert alert-danger display-hide" style="display: block;">
   <button class="close" data-close="alert"></button>
   <span> </span>
  </div>
 @endif
 <div class="form-group">
  <label class="control-label visible-ie8 visible-ie9">用户名</label>
  <input class="form-control placeholder-no-fix" type="text" autocomplete="off" placeholder="Username" name="username"> </div>
 <div class="form-group">
  <label class="control-label visible-ie8 visible-ie9">密码</label>
  <input class="form-control placeholder-no-fix" type="password" autocomplete="off" id="register_password" placeholder="Password" name="password"> </div>
 <div class="form-group">
  <label class="control-label visible-ie8 visible-ie9">重复密码</label>
  <input class="form-control placeholder-no-fix" type="password" autocomplete="off" placeholder="Repeat password" name="password_confirmation"> </div>
 <div class="form-group">
  <label class="control-label visible-ie8 visible-ie9">用户组</label>
  <select name="group" class="form-control">
    <option value="1"> 超级管理员 </option>
    <option value="2"> 管理员 </option>
    <option value="3"> 编辑 </option>
  </select>
 </div>
 <div class="form-actions">
  <button type="submit" id="register-submit-btn" class="btn btn-success uppercase pull-right">注册</button>
 </div>
</form>

5. 中间件?用户必须登录

现在注册都完成了,我们就差用户的判断了。 需求注册账号必须只能是有超级管理员权限的账号才可以注册。

这种情况下按照我们一般的步骤就是在postRegister方法里直接查出用户的信息,然后查看用户是否满足这个权限,不满足的情况下就跳转到其它页面。

这种方法可以,但是,我们既然有超级管理员和管理员这些权限区分,肯定不止一个地方使用,其它地方也会用到。

然后会有人想到在model里写个方法,以后有需要都可以直接调用。

这个方法也可以,不过,我们推荐使用laravel提供的中间件这个功能,这个功能非常强大,也非常好用。现在我们就使用中间件这个功能。

因为我们是后台内容管理系统,所以,我们首先创建一个中间件,功能是,所有页面进入前,必须是登录状态,否则跳到登录页。

查看手册发现可以使用php artisan make:middleware CheckLoginMiddleware命令创建一个中间件,当然复制一个差不多的文件,改下也是一样的。

然后会在app/Http/Middleware/目录下创建了一个CheckLoginMiddleware中间件文件,里面只有一个handle()方法,我们直接在里面增加我们的功能

<?php

namespace App\Http\Middleware;

use Closure;
use Auth;

class CheckLoginMiddleware
{
 public function handle($request, Closure $next)
 {
  //使用Auth方法,需要引入use Auth;方法
  //$request->is('login')表示请求的URL是否是登录页
  //因为我们打算使用全局的,所以,需要把登录页排除,不然会无限重定向
  //如果你的登录页不是/login,而是/auth/login的话,就写$request->is('auth/login')
  //并且我们要在请求处理后执行其任务,因为我们需要获取到用户的登录信息
  $response = $next($request);
  if (!Auth::check() && !$request->is('login')) {
   return redirect('/login');
  }
  return $response;
 }
}

这个中间件的功能是,如果有路由产生,首先使用Auth::check()判断用户是否登录,如果没有登录的跳转到登录页。

方法写好了,但是还不能使用,我们需要注册下这个中间件,告诉框架我们这个中间件写好了,可以使用了,使用的范围是哪里。

app/Http/目录下有个Kernel.php文件是注册这个中间件的,也就是告诉框架,我们写好了这个中间件。

Kernel.php文件里有两个数组属性,一个$middleware表示全局使用,一个$routeMiddleware表示可以选择使用。

全局使用的意思是,不管你请求哪个页面,都会先执行这个中间件。

选择使用表示,需要哪个HTTP请求,要求执行中间件,就在哪个地方执行。

这里每个页面都要求必须登录的话,可定是注册一个全局的,在$middleware数组属性里加入一条

\App\Http\Middleware\CheckLoginMiddleware::class

注册下,就可以使用了

>注意:请记住,如果定义全局的要格外小心,比如上面我们要排除登录页,不然因为用户没有登录,所以在哪个页面都会重定向到登录页,当然也包括登陆页

6. 中间件?特殊页面需要验证用户组

现在是进行用户权限页面的限制,同样我们也要重新创建一个中间件

使用php artisan make:middleware CheckGroupMiddleware创建一个新的中间件,用来判断这个用户是否满足这个权限

<?php

namespace App\Http\Middleware;

use Closure;
use Auth;

class CheckGroupMiddleware
{
 public function handle($request, Closure $next)
 {
  $user = Auth::user();
  if ($user->groupid != 1) {
   return redirect('/');
  }
  return $next($request);
 }
}

这里我们还是通过Auth::user()来获取到用户的信息,然后判断用户的组,不属于超级管理员就跳到首页。

然后我们在到app/Http/目录下有个Kernel.php文件是注册这个中间件的,这次我们注册为可以选择的中间件。

这个中间件因为是可以选择的,所以我们还需要给它起个别名,在$routeMiddleware数组属性里加如一条

'user.group' => \App\Http\Middleware\CheckGroupMiddleware::class

创建一个可以使用usergroup这个名字使用的中间件。

创建好后,我们可以选择在哪里使用,一个是在router.php的路由文件里加入,一个是在controller里使用

在router.php文件里使用

Route::get('/', ['middleware' => ['user.group'], function () {
 //
}]);

在控制器内使用

$this->middleware('user.group');

这里我们选择在路由里添加中间件。让注册页面只能是超级管理员才可以注册

Route::get('register', 'UserController@getRegister')->middleware('user.group');
Route::post('register', 'UserController@postRegister')->middleware('user.group');

我们目前只有两个路由要判断权限,所以使用了链式的写法,当然你也可以按照手册里上使用组的方式,组的方式更为优雅。

当然如果你的整个控制器内的方法都需要中间件进行验证过滤的话,你也可以创建组的形式,也可以直接在控制器内使用__construct方法,让每次请求这个控制器时,先执行中间件

class MyController extends Controller
{
 public function __construct()
 {
  $this->middleware('user.group');
 }

 public function index()
 {
  return view('my.index');
 }
}

总结

以上就是Laravel注册重构的全部内容,希望本文的内容对大家使用Laravel能有所帮助,如果有疑问欢迎大家留言讨论,小编会尽快给大家回复。

PHP 相关文章推荐
谈谈PHP语法(5)
Oct 09 PHP
php用正则表达式匹配中文实例详解
Nov 06 PHP
zf框架的db类select查询器join链表使用示例(zend框架)
Mar 14 PHP
PHP简单实现“相关文章推荐”功能的方法
Jul 19 PHP
php计算两个日期相差天数的方法
Mar 14 PHP
PHP中$_SERVER使用说明
Jul 05 PHP
php生成带logo二维码方法小结
Apr 08 PHP
Apache无法自动跳转却显示目录的解决方法
Nov 30 PHP
PHP开发的微信现金红包功能示例
Jun 29 PHP
php学习笔记之mb_strstr的基本使用
Feb 03 PHP
PDO::beginTransaction讲解
Jan 27 PHP
Laravel 框架返回状态拦截代码
Oct 18 PHP
PHP实现路由映射到指定控制器
Aug 13 #PHP
Yii2.0中的COOKIE和SESSION用法
Aug 12 #PHP
PHP Oauth授权和本地加密实现方法
Aug 12 #PHP
PHP 读取大文件并显示的简单实例(推荐)
Aug 12 #PHP
PHPWind9.0手动屏蔽验证码解决后台关闭验证码但是依然显示的问题
Aug 12 #PHP
PHP请求Socket接口测试实例
Aug 12 #PHP
php+jquery+html实现点击不刷新加载更多的实例代码
Aug 12 #PHP
You might like
php 上传文件类型判断函数(避免上传漏洞 )
2010/06/08 PHP
PHP中实现crontab代码分享
2015/03/26 PHP
PHP7匿名类的用法示例
2019/04/05 PHP
PHP 计算至少是其他数字两倍的最大数的实现代码
2020/05/26 PHP
“不能执行已释放的Script代码”错误的原因及解决办法
2007/09/09 Javascript
chrome原生方法之数组
2011/11/30 Javascript
Javascript 判断是否存在函数的方法
2013/01/03 Javascript
页面载入结束自动调用js函数示例
2013/09/23 Javascript
鼠标拖动实现DIV排序示例代码
2013/10/14 Javascript
jquery $.fn $.fx是什么意思有什么用
2013/11/04 Javascript
Jquery修改页面标题title其它JS失效的解决方法
2014/10/31 Javascript
js实现div在页面拖动效果
2016/05/04 Javascript
DWR中各种java方法的调用
2016/05/04 Javascript
微信QQ的二维码登录原理js代码解析
2016/06/23 Javascript
webpack+vue.js实现组件化详解
2016/10/12 Javascript
javascript 中的try catch应用总结
2017/04/01 Javascript
vue 请求后台数据的实例代码
2017/06/22 Javascript
js脚本编写简单刷票投票系统
2017/06/27 Javascript
浅谈Node.js之异步流控制
2017/10/25 Javascript
深入理解Vue nextTick 机制
2018/04/28 Javascript
前端深入理解Typescript泛型概念
2020/03/09 Javascript
解决elementui表格操作列自适应列宽
2020/12/28 Javascript
python ElementTree 基本读操作示例
2009/04/09 Python
Python反射用法实例简析
2017/12/22 Python
Python学习之Django的管理界面代码示例
2018/02/10 Python
Python3.4 splinter(模拟填写表单)使用方法
2018/10/13 Python
python 实现视频 图像帧提取
2019/12/10 Python
python递归函数用法详解
2020/10/26 Python
手工制作的男士奢华英国鞋和服装之家:Goodwin Smith
2019/06/21 全球购物
static函数与普通函数有什么区别
2015/12/25 面试题
法律专业应届本科毕业生求职信
2013/10/25 职场文书
物流管理专业应届生求职信
2013/11/21 职场文书
汽车专业学生自我评价
2014/01/19 职场文书
领导干部培训感言
2014/01/23 职场文书
大学生全国两会报告感想
2014/03/17 职场文书
分位数回归模型quantile regeression应用详解及示例教程
2021/11/02 Python