简单记录一套流程和思路,详细的实现和变化可以参阅 Laravel 官方文档。
功能实现
写一个控制器,包含 表单验证
、Restful
、Eloquent
、 Json返回
、 异常处理
、路由中间件
和 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);
}