mdelariva/api-controller

API基本请求控制

v1.10.0 2022-10-12 17:10 UTC

This package is auto-updated.

Last update: 2024-09-12 21:36:31 UTC


README

Laravel控制器CRUDL特性API服务器。

动作路由

动词URI动作路由名称描述
GET/{实体}index{实体}.index列表(允许筛选)
GET/{实体}/{id}show{实体}.show显示完整的{实体}
POST/{实体}store{实体}.store创建新的{实体}
PUT/{实体}/{id}update{实体}.update更新{实体}
DELETE/{实体}/{id}destroy{实体}.destroy删除{实体}

命名规范

  • 模型类名称:Entity
  • 控制器类名称:EntityController
  • 资源类名称:EntityResource

验证

每个模型必须有两个公共静态方法

  • getValidations()必须返回一个数组,其中每个元素的键是字段名,值是验证规则(Illuminate\Validation\Validator)。
  • getValidationsRequired()必须返回一个必需字段名的数组。

示例

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Example extends Model
{
    protected $fillable = [
        'name',
        'code',
    ];

    // validations

    public static function getValidations()
    {
        $validations = [
            'name'         => 'string|between:5,255',
            'code'         => 'string|size:2',
        ];
        return $validations;
    }

    public static function getValidationsRequired()
    {
        $validationsRequired = [
            'name',
            'code',
        ];
        return $validationsRequired;
    }
}

索引列表

可用的请求参数

  • where[] . 有效操作符(附加到字段名后)

    • {字段名} => field = value
    • {字段名}[] => field IN (value)
    • {字段名}_gt => field > value
    • {字段名}_ge => field >= value
    • {字段名}_lt => field < value
    • {字段名}_le => field <= value
    • {字段名}_ct => field like "%value%"
    • {字段名}_pr => field like "value%"
    • {字段名}_ap => field like "%value"
  • orderBy

  • orderByDir
  • limit (-1 获取所有记录;默认=20)

属性

你可以在控制器中声明以下属性

名称默认值类型描述
limitAmount20int要返回的记录数。
indexDefaultOrderBystring排序的字段
indexDefaultOrderByDirstring排序方向(ascdesc
model使用命名规范生成名称string模型类的名称
modelPath\App\Models\string模型类路径
resource使用命名规范生成名称string资源类的名称
resourcePath\App\Http\Resources\string资源类路径

钩子

所有钩子类型必须在MdelaRiva\ApiRequests\Libraries\Hook\HookType类中定义。

动作名称参数
InitBefore
InitAfter
indexIndexBefore\Illuminate\Http\Request
indexIndexPreRun\Illuminate\Database\Eloquent\Builder
indexIndexAfterbool, \Illuminate\Database\Eloquent\Model
storeStoreBefore\Illuminate\Http\Request
storeStoreAfterbool, \Illuminate\Database\Eloquent\Model
updateUpdateBefore\Illuminate\Http\Request
updateUpdateAfterbool, \Illuminate\Database\Eloquent\Model
destroyDeleteBefore\Illuminate\Database\Eloquent\Model
destroyDeleteAfterint

使用示例

Laravel

1-routes/api.php 中定义API资源路由

<?php

Route::apiResource( 'articles', 'ArticleController' );

2-app/Models/Article.php 中定义模型验证

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Article extends Model
{
    protected $fillable = [
        'name',
        'code',
    ];

    public static function getValidations()
    {
        $validations = [
            'name'         => 'string|between:5,255',
            'code'         => 'string|size:2',
        ];
        return $validations;
    }

    public static function getValidationsRequired()
    {
        $validationsRequired = [
            'name',
            'code',
        ];
        return $validationsRequired;
    }
}

3- 定义控制器 app/Http/Controllers/ArticleController.php

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use MdelaRiva\ApiRequests\ApiBaseRequests;
use MdelaRiva\ApiRequests\Libraries\Hook\Hook;
use MdelaRiva\ApiRequests\Libraries\Hook\HookType;
use App\Models\ArticleThirdParty;
use App\Http\Resources\ArticleThirdPartyResource;

class ArticleController extends Controller
{
    use ApiBaseRequests;

    /**
     * ApiBaseRequests: Index - Order by
     *
     * @var string
     */
    protected $indexDefaultOrderBy = 'name';

    /**
     * ApiBaseRequests: Index - Order by direction (ASC, DESC)
     *
     * @var string
     */
    protected $indexDefaultOrderByDir = 'desc';
    
    /**
     * ApiBaseRequests: Hooks register
     *
     * @var string
     */
    protected function registerApiHooks(){
        Hook::register( HookType::IndexBefore, function(){
            $this->model = ArticleThirdParty::class;
            $this->resource = ArticleThirdPartyResource::class;
        } );

        Hook::register( HookType::IndexPreRun, function( $query ){
            $query->groupBy( 'party_id' );
        } );
    }
}

4- 发送请求