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