• 技术文章 >php框架 >Laravel

    详解Laravel注册重构

    藏色散人藏色散人2020-11-18 15:15:21转载110

    下面由Laravel框架教程栏目给大家介绍Laravel注册重构,希望对需要的朋友有所帮助!

    需要使用laravel搭建一个后台内容管理系统,但是laravel默认的登陆注册不能满足目前的需求
    注册的话因为是用在后台,并且不需要使用邮箱注册的,而且会有一些额外的配置需要在注册时一起填写。

    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="{{ url('/register') }}" method="post">
            {!! csrf_field() !!}
            <h3 class="font-green">Sign Up</h3>
            @if(count($errors) > 0)
                <p class="alert alert-danger display-hide" style="display: block;">
                    <button class="close" data-close="alert"></button>
                    <span> {{ $errors->first() }}  </span>
                </p>
            @endif
            <p 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"> </p>
            <p 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"> </p>
            <p 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"> </p>
            <p 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>
            </p>
            <p class="form-actions">
                <button type="submit" id="register-submit-btn" class="btn btn-success uppercase pull-right">注册</button>
            </p>
        </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

    注册下,就可以使用了

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

    5. 中间件--特殊页面需要验证用户组

    现在是进行用户权限页面的限制,同样我们也要重新创建一个中间件
    使用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注册重构的详细内容,更多请关注php中文网其它相关文章!

    本文转载于:csdn,如有侵犯,请联系a@php.cn删除
    专题推荐:Laravel
    上一篇:如何解决Laravel修改数据与原数据一样,导致没有执行sql的问题 下一篇:详解Laravel API允许跨域访问
    第14期线上培训班

    相关文章推荐

    • 【扩展推荐】laravel-download-link(生成下载链接)• Laravel Facade 的详细解读• ​你会使用Laravel视图view()与重定向redirect()吗?• Laravel如何实现无限极分类

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网