octavianparalescu / laravel-api-controller-methods
Laravel 控制器方法,允许开发者快速构建基于资源的 API
dev-master
2021-01-07 22:37 UTC
Requires
- php: >=7.1
- ext-json: *
- guzzlehttp/guzzle: >=6.2
- illuminate/support: >=4.1.0
This package is auto-updated.
Last update: 2024-09-08 06:47:24 UTC
README
Laravel 控制器方法,允许开发者快速构建只读的基于资源的 API。
特别适用于创建用于静态网站或很少修改的数据的只读 API。
要求
使用方法
使用 composer 安装
composer require octavianparalescu/laravel-api-controller-methods
在创建模型、控制器并将控制器定义为资源控制器后,将请求转换器作为依赖项加载,将特性加载到控制器中并使用特性方法
<?php // app/Http/Controllers/CityController.php namespace App\Http\Controllers; use App\City; use OctavianParalescu\ApiController\Controllers\ApiIndexTrait; use OctavianParalescu\ApiController\Controllers\ApiShowTrait; use OctavianParalescu\ApiController\Converters\RequestConverter; class CityController extends Controller { use ApiIndexTrait, ApiShowTrait; const CAN_SELECT = ['id', 'name']; // Fields that can be selected const OTHER_SINGLE_IDENTIFIER = 'name'; // If you have a different primary key than "id" const FILTERABLE_BY = ['name']; // If empty, resource is not filterable at all /** * @var RequestConverter */ private $requestConverter; public function __construct(RequestConverter $requestConverter) { $this->requestConverter = $requestConverter; } public function index() { return $this->apiIndex($this->requestConverter, City::class); } public function show($id) { return $this->apiShow($this->requestConverter, City::class, $id); } }
将控制器作为资源控制器使用
<?php // routes/web.php use Illuminate\Support\Facades\Route; Route::resource('city', 'CityController', ['only' => ['index', 'show']]);
为了能够进行跨源请求,我推荐以下中间件: https://gist.github.com/octavianparalescu/b49af1b859f7850b0d7de426ab989b0b
为了默认格式化 JSON 响应,我推荐以下中间件: https://gist.github.com/octavianparalescu/22859ceadff3cda8d278663d9835dd88
模型选项
您可以使用 CAN_SELECT 和 SORTABLE_BY 类常量在模型中定义设置
<?php namespace App; use Illuminate\Database\Eloquent\Model; class County extends Model { const CAN_SELECT = ['id', 'name', 'type', 'created_at']; const SORTABLE_BY = ['id', 'name']; }
您可以在模型中定义关系,然后可以通过生成的 API 访问这些关系
<?php namespace App; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\Pivot; class CitySection extends Pivot { /** * This pivot table refers to an entity that has multiple Item entities * as children * @return HasMany */ public function items() { return $this->hasMany(Item::class, 'city_section_id', 'id'); } public function city() { return $this->belongsTo(City::class); } public function section() { return $this->belongsTo(Section::class); } }
示例用法
https:///item/1?select[city_section]=id https:///city_section/2?fields[city]=name&fields[section]=name&fields[items]=city_section_id,name https:///city/25291?fields[county]=name&fields[sections]=id,name,description https:///city?fields[sections]=id,name&per_page=3186 https:///city?fields[sections]=id,name&per_page=3186&filters[county][]=name%20=%20Bac%C4%83u&filters[county][]=id=47 https:///city?fields[sections]=id,name&per_page=3186&filters[county]=name%20=%20Bac%C4%83u https:///city?fields[city]=name,plm&fields[items]=id&fields[kkt]=2&fields[county]=name&fields[sections]=id,name,description&limit[sections]=2&filters[city]=name%20LIKE%20Scor%C8%9Beni
模型和相应的表必须遵循官方 Laravel 命名约定。
待办事项
- 标签版本
- 测试