Laravel8 快速入门教程十九 - 用户登录业务编写

117 阅读2分钟

本文由 简悦 SimpRead 转码, 原文地址 juejin.cn

「这是我参与 11 月更文挑战的第 10 天,活动详情查看:2021 最后一次更文挑战

背景

  1. 项目用 Thinkphp5.1 开发完成,对于各种关系模型的查询 Tp 处理起来还是比较吃力的。
  2. 作为努力奔跑的程序员,下一个项目我们决定用 Lavarel 进行开发。
  3. 因为掘金粑粑有奖励,所以把部分 gitee 上的私有的部分学习笔记整理一下。

说明

Laravel 属于中大型框架,各种功能都被内置了,而且 Laravel 官方的文档看的我是云里雾里的,对于新手感觉不是很友好。所以此系列文章只适合有 PHP 基础。想快速入门搞开发的

正文

前面已经完整走过两个接口,所以登录接口会快速的进行实现。这可能也是后期项目开发过程中的一个无限重复过程吧。

  1. 定义路由 在文件 routes\web.php

Route::post('/login',[LogRegController::class,'login']); // 前端登录操作 注意命名空间

  1. 创建验证文件 app\Http\Validate\Login.php
<?php
namespace app\Http\Validate;

use App\Http\Validate\BaseValidate;

class Login extends BaseValidate{

    /**
     * 定义验证规则
     */
    protected $rules = [
        'name'=>'required|string|min:6|max:10',
        'password'=>'required|string|min:6:max:12'
    ];

    /**
     * 定义提示信息
     */
    protected $message = [
        'name.required'=>'账号必须填写',
        'password.required'=>'密码必须填写',
        'name.min'=>'账号最少6位',
        'password.min'=>'密码最少6位',
        'name.max'=>'账号最多10位',
        'password.max'=>'密码最多12位'
    ];
}
复制代码

这里因为是登录,就设置俩字段。一个是用户名,一个是密码。验证规则定义好就相当于需要的参数已经定义好了。

  1. Service 层业务编写
<?php
namespace app\Http\Service;

use App\Models\User;
use Illuminate\Support\Facades\Validator;

class LogRegService{

    //用户名查询
    public function getUserByName($name){
        $res = User::query()->where('name',$name)->first();

        return $res;
    }
}
复制代码

  1. 然后控制器层获取验证通过的数据 请求 Service 层数据。做登录的逻辑。
<?php

namespace App\Http\Controllers;

use App\Exceptions\ApiException;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Service\LogRegService;
use App\Http\Validate\Login as LoginValidate;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;

class LogRegController extends Controller
{   
    private $LGServer;
    //实例化
    public function __construct()
    {
        $this->LGServer = new LogRegService();
    }

    //登录操作
    public function login(Request $request){
        
        $data = ((new LoginValidate()))->getDateByRules($request->all());
        
        //获取数据
        $user = $this->LGServer->getUserByName($data['name']);
        if(is_null($user)){
            return $this->fail("用户不存在");
        }

        //验证密码
        $is_pass = Hash::check($data['password'], $user->getAuthPassword());
        if(!$is_pass){
            return $this->fail("用户不存在或密码错误");
        }
        $token = Auth::guard('api')->login($user);

        return $this->success($token);
    }
}
复制代码

如果用户的用户名跟密码通过了验证,那么传统 web 是记录 session 中。因为我们这里是写的接口,所以这里的逻辑是,如果用户通过验证,这里是给返回一个合法的 令牌【token】,后续的所有的需要登录的地方都需要携带 token