示例详解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 相关文章推荐
phpBB BBcode处理的漏洞
Oct 09 PHP
使用无限生命期Session的方法
Oct 09 PHP
PHP开发中常用的三个表单验证函数使用小结
Mar 03 PHP
PHP开发的一些注意点总结
Oct 12 PHP
PHP对表单提交特殊字符的过滤和处理方法汇总
Feb 18 PHP
php通过数组实现多条件查询实现方法(字符串分割)
May 06 PHP
ThinkPHP连接数据库的方式汇总
Dec 05 PHP
smarty中常用方法实例总结
Aug 07 PHP
LNMP部署laravel以及xhprof安装使用教程
Sep 14 PHP
thinkphp5 migrate数据库迁移工具
Feb 20 PHP
PHP 并发场景的几种解决方案
Jun 14 PHP
在Laravel中使用GuzzleHttp调用第三方服务的API接口代码
Oct 15 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注释实例技巧
2008/10/03 PHP
什么是PEAR?什么是PECL?PHP中两个容易混淆的概念解释
2015/07/01 PHP
摘自织梦CMS的HTTP文件下载类
2015/08/08 PHP
PHP实现数据库统计时间戳按天分组输出数据的方法
2017/10/10 PHP
ext实现完整的登录代码
2008/08/08 Javascript
jquery中通过过滤器获取表单元素的实现代码
2011/07/05 Javascript
javascript数组去重方法终极总结
2014/06/05 Javascript
javascript实现点击商品列表checkbox实时统计金额的方法
2015/05/15 Javascript
JavaScript随机打乱数组顺序之随机洗牌算法
2016/08/02 Javascript
浅谈JavaScript中变量和函数声明的提升
2016/08/09 Javascript
javascript之with的使用(阿里云、淘宝使用代码分析)
2016/10/11 Javascript
BootStrap便签页的简单应用
2017/01/06 Javascript
详解Nuxt.js Vue服务端渲染摸索
2018/02/08 Javascript
基于vue-video-player自定义播放器的方法
2018/03/21 Javascript
浅谈vue项目可以从哪些方面进行优化
2018/05/05 Javascript
vue中的watch监听数据变化及watch中各属性的详解
2018/09/11 Javascript
谈谈JavaScript中super(props)的重要性
2019/02/12 Javascript
新手入门带你学习JavaScript引擎运行原理
2019/06/24 Javascript
js getBoundingClientRect使用方法详解
2019/07/17 Javascript
使用go和python递归删除.ds store文件的方法
2014/01/22 Python
将Django使用的数据库从MySQL迁移到PostgreSQL的教程
2015/04/11 Python
python机器学习之神经网络(二)
2017/12/20 Python
在echarts中图例legend和坐标系grid实现左右布局实例
2020/05/16 Python
python保留格式汇总各部门excel内容的实现思路
2020/06/01 Python
浅谈HTML5新增和废弃的标签
2019/04/28 HTML / CSS
文化宣传方案
2014/03/13 职场文书
投标保密承诺书
2014/05/19 职场文书
党员组织生活会发言材料
2014/10/17 职场文书
高中班主任评语
2014/12/30 职场文书
2015年党风廉政建设责任书
2015/01/29 职场文书
学生个人总结范文
2015/02/15 职场文书
2015年社区计生工作总结
2015/04/21 职场文书
2015社区爱国卫生工作总结
2015/04/21 职场文书
python基于tkinter制作m3u8视频下载工具
2021/04/24 Python
oracle索引总结
2021/09/25 Oracle
部分武汉产收音机展览
2022/04/07 无线电