sinclairt / api-foundation
REST API 的基础
2.0.2
2017-09-07 10:06 UTC
Requires
- sinclair/repository: 1.*
- spatie/laravel-fractal: ^5.0
Requires (Dev)
- laracasts/testdummy: ~2.0
- laravel/browser-kit-testing: ^2.0@dev
- laravel/laravel: ^5.5
- phpspec/phpspec: ~2.1
- phpunit/phpunit: ~6.0
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']]);
}):
为每个资源使用表单请求,这样您的验证就可以从控制器中抽象出来。我预计您将覆盖 store
和 update
方法,以便您可以注入表单请求。
最后,让我们使用路由模型绑定,以下是在 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);
}