octavianparalescu/laravel-api-controller-methods

Laravel 控制器方法,允许开发者快速构建基于资源的 API

dev-master 2021-01-07 22:37 UTC

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 命名约定。

待办事项

  • 标签版本
  • 测试