一些技巧让你的 Laravel 代码更优雅

时间:2022-06-27 02:50:55

简单记录一套流程和思路,详细的实现和变化可以参阅 Laravel 官方文档。

功能实现

写一个控制器,包含 表单验证RestfulEloquentJson返回异常处理路由中间件Swagger文档生成 的功能 。

路由中间件 + Restful 实现

/* |-------------------------------------------------------------------------- | 登录中间件 Authority 路由 |-------------------------------------------------------------------------- */

Route::group(['prefix' => 'v1','middleware' => 'Authority'],function (){
    Route::resource('Product','ProductController');
    // 省略

    /** * 可以定义一些非 restful 路由 * 获取试用品类 */
    Route::get('/getTryPercent', ['uses'=>'StaticController@getTryPercent']);

});

表单验证

  • 快速生成

    php artisan make:requests ProductValidate

  • 详细代码


namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Contracts\Validation\Validator;

class ProductValidate extends FormRequest
{
    /** * 授权验证 * * @return bool */
    public function authorize()
    {
        return true;
    }

    /** * 表单验证的验证规则 * * @return array */
    public function rules()
    {
        return [
            'BrandName' => 'filled|max:5',
            'ProductCname' => 'filled|max:5|unique:product',
            'UID' => 'required|Integer'
        ];
    }

    /** * 验证失败的异常处理 * @param Validator $validator */
    protected function failedValidation(Validator $validator)
    {
        $data['message'] = $validator->errors()->first();
        respondErr($data['message']);

    }
}

Eloquent

  • 快速生成

    php artisan make:model Model/Product

  • 详细代码

namespace App\Model;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;

class Product extends Model
{
    /** * 关联到模型的数据表 * * @var string */
    protected $table = 'product';

    /** * @var string 主键 */
    protected $primaryKey = 'ID';

    /** * @var bool 取消Eloquent 的默认时间 */
    public $timestamps = false;

    /** * @var string 设置 db-config-name */
    protected $connection = 'mysql';

    /** * @param \Illuminate\Database\Eloquent\Builder $query * @param $ID * @return mixed */
    public static function scopeOfID($query, $ID)
    {
        return $query->where('ID',$ID);
    }

    /** * 获取产品单条数据 * eloquent + DB查询 + 原生,按具体需求封装 查询 * @param $ID * @return mixed */
    public static function one($ID)
    {

        $productOneInfo = DB::table('product')->where('ID','=',$ID)->where('IsDeleted','=',0)->get();
        if (!$productOneInfo->isEmpty()){
          # 省略 ...
        }else{
            //抛出异常
            respondErr();
        }
        return $productOneInfo;
    }

    # eloquent 方式软删除
    public static function softDelete($ID)
    {
        $softDelete = self::where('ID',$ID)
        ->update(['IsDeleted' => 1]);
        return $softDelete;
    }
}

路由中间件

1 App\Http\Middleware\Authority.php

2 代码实现

如果是 Laravel全栈框架,可以更丰富功能,比如直接返回渲染的模版,跳转路由,这里是实现纯Api项目,实现简单验证即可。

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class Authority extends Controller {
    /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */
    public function handle($request, Closure $next) {
        //添加逻辑 如果没登录
        $inputList = $request->all();
        $UID = isset($inputList['UID']) ? $inputList['UID'] : 0 ;


        $loginStatus = $this->loginCheck($UID);
        if (1 == $loginStatus) {
            ## 已经登陆了,正常跳转
            return $next($request);
        } elseif (-2 == $loginStatus){
            ## 未登录
            return respond($loginStatus,'-1','身份验证失败,请重新登录');
        }elseif (-1 == $loginStatus){
            ## 未登录
            return respond($loginStatus,'-1','会话超时,请重新登录');
        }else{
            return respond($loginStatus,'-1','登录身份异常');
        }

    }

    /** * 检查是否登录Cookie * @param int $UID * @return int */
    public function loginCheck($UID=0) {
    # 省略验证代码
    }
}

Swagger 文档

参考这篇就可以~ Swagger 文档

控制器


use App\Model\Product;
use Illuminate\Http\Request;
use App\Http\Requests\ProductValidate;

/** * * @SWG\Get(path="/v1/Product", * 省略SWG 生成文档代码 * Restful-Post Api */
public function store(ProductValidate $productValidate,Product $product) {
        # 表单验证
        $inputList = $productValidate->validated();
        unset($inputList['UID']);
        # Eloquent
        $this->resData = $product->insertGetId($inputList);
        # Json返回 + 异常处理
        return respond($this->resData,$this->resData);
    }