一些技巧讓你的 Laravel 程式碼更優雅

Npcccccc發表於2018-06-06

簡單記錄一套流程和思路,詳細的實現和變化可以參閱 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);
    }

相關文章