sinclairt/api-foundation

REST API 的基础

2.0.2 2017-09-07 10:06 UTC

This package is not auto-updated.

Last update: 2024-09-27 22:56:54 UTC


README

使用 Fractal 构建 RESTful 控制器的一个简单特性。

安装

config/app.php 的 providers 数组中注册服务提供者: Sinclair\ApiFoundation\Providers\ApiFoundationServiceProvider::class

用法

在您的 API 控制器内部使用 \Sinclair\ApiFoundation\Traits\ApiFoundation 特性来创建 RESTful 控制器。

此特性被编写为特性以避免继承问题,因此您可以自由覆盖任何方法。

ApiFoundation 随带默认的转换器,它将 Eloquent 模型转换为数组,并通过重载 __call 方法来处理额外的关联。

您需要将控制器构造函数 __construct 注入 Sinclair\Repository\Contracts\Repository 的资源实现和您希望使用的转换器。您可以可选地设置 Fractal 使用的资源名称。

如果您需要,有流畅的设置器用于转换器、资源名称和仓库。

可用方法
  • index GET 分页集合
  • filter POST 分页集合
  • store POST 项目
  • show GET 项目
  • update PUT/PATCH 项目
  • destroy DELETE 项目
  • restore GET 项目
使用 Laravel/Eloquent 减轻负担!

建议使用 Eloquent 提供的属性以减少转换器中的代码。

  • 使用 $hidden/$visible 属性来控制数组中可见的内容。
  • 使用 $casts 属性来控制数组中字段的类型转换。有关更多详细信息,请参阅 此处
  • 使用 $with 属性来控制默认预加载哪些关联。
class User extends Model
{
    protected $fillable = ['name', 'email', 'password', 'api_token', 'is_admin'];
    
    protected $hidden = ['password'];
    // or
    protected $visible = ['name', 'email', 'api_token', 'is_admin'];
    
    protected $casts = [
        'name'      => 'string',
        'posts'     => 'collection',
        'is_admin'  => 'boolean'
    ];
    
    protected $with = [
        'posts'
    ];
    
    public function posts()
    {
        return $this->hasMany(App\Posts::class);
    }
}

建议将令牌认证驱动程序添加到 App\Http\Kernel.php 中的 api 中间件组

'api' => [
            'throttle:60,1',
            'auth:token'
        ],

但您可以使用自己的认证驱动程序。

强烈建议设置一个 API 路由组,例如

Route::group(['middleware' => 'api', 'namespace' => 'Api'], function()
{
    Route::get('api/v1/user/{user}/restore', [
        'as'   => 'api.v1.user.restore',
        'uses' => 'UserController@restore'
    ]);
    
    Route::post('api/v1/user/{user}/filter', [
        'as'   => 'api.v1.user.filter',
        'uses' => 'UserController@filter'
    ]);
    
    Route::resource('/api/v1/user', 'UserController', ['except' => ['create', 'edit']]);
}):

为每个资源使用表单请求,这样您的验证就可以从控制器中抽象出来。我预计您将覆盖 storeupdate 方法,以便您可以注入表单请求。

最后,让我们使用路由模型绑定,以下是在 App\Providers\RouteServiceProvider 中用于此的快速脚本。

protected $bindings = [
    'user'
];

public function boot( Router $router )
{
    foreach ( $this->bindings as $model )
    {
        $router->bind(strtolower($model), function ( $value ) use ( $model )
        {
            $model = app(studly_case($model));

            $model = in_array(SoftDeletes::class, class_uses($model)) ? $model->withTrashed()
                                                                              ->find($value) : $model->find($value);

            // the abort is optional
            if ( is_null($model) )
                abort(403);

            return $model;
        });
    }

    parent::boot($router);
}