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

本文介绍如何使用Laravel框架实现RESTful API,涵盖表单验证、Eloquent ORM、JSON响应处理及异常处理等内容,并通过Swagger生成API文档。

简单记录一套流程和思路,详细的实现和变化可以参阅 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);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值