示例详解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框架Phpbean说明
Jan 10 PHP
php输出表格的实现代码(修正版)
Dec 29 PHP
PHP文件读写操作之文件读取方法详解
Jan 13 PHP
PHP数组操作汇总 php数组的使用技巧
Jul 17 PHP
php中计算程序运行时间的类代码
Nov 03 PHP
CodeIgniter生成网站sitemap地图的方法
Nov 13 PHP
php实现邮件发送并带有附件
Jan 24 PHP
详解php设置session(过期、失效、有效期)
Nov 12 PHP
PHP下SSL加密解密、验证、签名方法(很简单)
Jun 28 PHP
php微信开发之百度天气预报
Nov 18 PHP
Yii2中datetime类的使用
Dec 17 PHP
如何在PHP中使用AES加密算法加密数据
Jun 24 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数据缓存的使用说明
2013/05/10 PHP
php从memcache读取数据再批量写入mysql的方法
2014/12/29 PHP
PHP isset()及empty()用法区别详解
2020/08/29 PHP
Javascript 圆角div的实现代码
2009/10/15 Javascript
用Jquery实现多级下拉框无刷新的联动
2010/12/22 Javascript
jQuery EasyUI API 中文文档 - Spinner微调器使用
2011/10/21 Javascript
自动刷新网页,自动刷新当前页面,JS调用
2013/06/24 Javascript
仿新浪微博登陆邮箱提示效果的js代码
2013/08/02 Javascript
框架页面高度自动刷新的Javascript脚本
2013/11/01 Javascript
举例讲解Node.js中的Writable对象
2015/07/29 Javascript
实例详解jQuery Mockjax 插件模拟 Ajax 请求
2016/01/12 Javascript
jQuery前端开发35个小技巧
2016/05/24 Javascript
js获取上传文件的绝对路径实现方法
2016/08/02 Javascript
Bootstrap选项卡学习笔记分享
2017/02/13 Javascript
写gulp遇到的ES6问题详解
2018/12/03 Javascript
jQuery选择器之层次选择器用法实例分析
2019/02/19 jQuery
vue登录注册实例详解
2019/09/14 Javascript
原生JS实现萤火虫效果
2020/03/07 Javascript
[00:10]DOTA2全国高校联赛速递
2018/05/30 DOTA
python opencv 直方图反向投影的方法
2018/02/24 Python
python执行scp命令拷贝文件及文件夹到远程主机的目录方法
2019/07/08 Python
我们为什么要减少Python中循环的使用
2019/07/10 Python
Python爬虫抓取技术的一些经验
2019/07/12 Python
Python学习笔记之列表和成员运算符及列表相关方法详解
2019/08/22 Python
Python使用tkinter模块实现推箱子游戏
2019/10/08 Python
tensorflow 实现打印pb模型的所有节点
2020/01/23 Python
毕业证代领委托书
2014/09/26 职场文书
党员教师四风问题整改措施思想汇报
2014/10/08 职场文书
党员专题组织生活会发言材料
2014/10/17 职场文书
2014年团支部工作总结
2014/11/17 职场文书
小学班主任自我评价
2015/03/11 职场文书
销售员自我评价
2015/03/11 职场文书
2015年政务公开工作总结
2015/05/19 职场文书
公历12个月名称的由来
2022/04/12 杂记
使用Python获取字典键对应值的方法
2022/04/26 Python
使用compose函数优化代码提高可读性及扩展性
2022/06/16 Javascript