krasnikov/json-api-server

只需几分钟即可在Laravel中设置JSON API。

0.4.3.5 2019-04-23 19:00 UTC

README

Latest Version on Packagist Build Status License: MIT Made by SWIS

Laravel JSON API服务器

使用本包,只需几分钟即可设置Laravel API。所有标准API功能已经为您准备好。

本包致力于在构建API时为您节省时间。它已经包含了API应具备的基本功能,如

  • 生成器,用于为每个模型生成所需文件
  • 抽象层,用于处理基本的CRUD操作
  • 为所有端点创建路由
  • 支持一些有用的URL参数
  • 权限和路由权限处理
  • 以json api格式(https://jsonapi.fullstack.org.cn/)返回响应
  • 根据数据库自动翻译您的模型

安装

通过Composer

$ composer require krasnikov/json-api-server

示例

请参阅sample文件夹,了解使用本包的应用程序示例。

用法

基本API类

您的类应/可能继承的一些基本类

BaseApiController

此控制器处理您的基本CRUD操作以及权限(如果您选择使用权限)。

BaseApiRepository

这是一个标准的基类仓库,增加了一个功能,可以确定您的模型关系。

如果您想使用自己的BaseRepository,您必须实现RepositoryInterface。这确保了您与BaseApiController的完全兼容性。

BaseApiRepository使用一个特质来检索模型关系。如果您想使用现有的实现,可以使用这个特质。

生成所需文件

安装包后,您可以立即通过执行以下命令生成所有所需文件

$ php artisan json-api-server:generate-all {Model}

要覆盖默认路径而不覆盖laravel_generator配置文件,可以使用--path={path}选项。例如

$ php artisan json-api-server:generate-all Test --path=app/temp/

这将生成以下文件

  • 一个eloquent模型
  • 一个翻译模型
  • 一个API控制器
    • 应扩展BaseApiController
  • 一个定义所有CRUD端点的路由文件
  • 您的模型的仓库
    • 可以扩展BaseApiRepository
  • 一个用于检查权限的策略
  • 一个检查用户是否有端点权限的测试

您将能够执行基本的CRUD操作而无需编写任何代码。

您还可以单独生成文件

$ php artisan json-api-server:generate-controller {name}
$ php artisan json-api-server:generate-model {name}
$ php artisan json-api-server:generate-model-permissions {name}
$ php artisan json-api-server:generate-policy {name}
$ php artisan json-api-server:generate-repository {name}
$ php artisan json-api-server:generate-routes {name}
$ php artisan json-api-server:generate-test {name}

配置

如果您想覆盖配置文件。

$ php artisan vendor:publish --tag=laravel-api
$ php artisan vendor:publish --tag=laravel-api-templates

如果您决定覆盖模板,请确保也覆盖laravel api配置。您必须在配置中定义您自己的模板所在位置。

这是默认配置

   return [
     // Generator configuration
     'path' => [
         'model' => app_path('/'),
 
         'model_permissions' => app_path('Permissions/'),
 
         'translation' => app_path('Translations/'),
 
         'controller' => app_path('Http/Controllers/Api/'),
 
         'repository' => app_path('Repositories/'),
 
         'policy' => app_path('Policies/'),
 
         'auth_test' => base_path('tests/Authentication/'),
 
         'templates' => 'vendor/krasnikov/laravel-api/resources/templates/',
 
         'routes' => app_path('Http/Routes/')
     ],
 
     'namespace' => [
         'model' => 'App',
 
         'model_permissions' => 'App\Permissions',
 
         'controller' => 'App\Http\Controllers\Api',
 
         'repository' => 'App\Repositories',
 
         'translation' => 'App\Translations',
 
         'policy' => 'App\Policies',
 
         'auth_test' => 'App\Tests\Authentication'
     ],
 
     // Permissions configuration
     'permissions' => [
         'checkDefaultIndexPermission' => false,
 
         'checkDefaultShowPermission' => false,
 
         'checkDefaultCreatePermission' => false,
 
         'checkDefaultUpdatePermission' => false,
 
         'checkDefaultDeletePermission' => false,
     ],
 
     // Load all relationships to have response exactly like json api. This slows down the API immensely.
     'loadAllJsonApiRelationships' => true,
]; 

请求和响应

所有请求和响应都按照https://jsonapi.fullstack.org.cn/指定的格式进行格式化。

您的控制器中有几个响应方法可供使用。目前实现了以下响应方法

return $this->respondWithOk($object);
return $this->respondWithPartialContent($object);
return $this->respondWithCreated($object);
return $this->respondWithNoContent($object);
return $this->respondWithCollection($object);

这些方法自动将您的对象转换为json api格式,并创建带有正确状态码和主体的响应。

使用策略

如果您决定使用策略来检查用户的权限,您需要将策略添加到您的 Providers\AuthServiceProvider 中。

 protected $policies = [
     Sample::class => SamplePolicy::class,
 ];
 
 public function boot()
 {
     $this->registerPolicies();
 }    

策略已预先配置,可配合 Laravel passport 使用,如果您想使用其他形式的授权操作,您可以更改方法。

如果您想将验证重定向到策略中的特定函数。

$this->authorizeAction('show');

如果您想检查他们是否有权请求特定对象,可以将该对象作为第二个参数添加。

$this->authorizeAction('show', $requestedObject);

开箱即用的 URL 参数

安装此包后,以下 URL 参数受支持

  • ?include={relationship}:向响应添加所有关系数据。
  • ?page[number]={pageNumber}:决定分页应显示的页面。
  • ?page[size]={每页显示数量}:决定每页获取多少项目。
  • ?ids={逗号分隔的ids}:检索属于指定 ids 的对象集合。
  • ?exclude_ids={逗号分隔的ids}:检索不属于指定 ids 的对象集合。
  • ?lang={language}:(需要 configure-locale 中间件)将 php 区域设置更改为所需的语言,并自动翻译所有可翻译模型。
  • ?fields={列}:检索特定列。
  • ?order_by_desc={列}:根据列降序排序。
  • ?order_by_asc={列}:根据列升序排序。
  • ?orderBy={列},{-列}:根据列升序/降序排序。

必需的中间件

  • inspect_content_type:必需。它确保请求应为 json 格式。如果格式不正确,则抛出 ContentTypeNotSupportedException。

可选中间件

存在可选中间件

  • configure-locale:用于配置响应的语言。还可以通过使用 URL 参数 ?lang={language} 来配置。

Passport 安装

注意:如果您想了解更多关于 Laravel passport 以及为什么应该运行这些命令的信息,请访问 https://laravel.net.cn/docs/passport

$ composer require laravel/passport
$ php artisan migrate
$ php artisan passport:install

运行此命令后,将 Laravel\Passport\HasApiTokens 特性添加到您的 App\User 模型中

接下来,您应该在 AuthServiceProvider 的 boot 方法中调用 Passport::routes 方法。

最后,在您的 config/auth.php 配置文件中,您应该将 API 认证保护程序的驱动选项设置为 passport。这将指示您的应用程序在验证传入的 API 请求时使用 Passport 的 TokenGuard。

如果您创建了自定义路由,请确保您在想要使用 passport 的所有路由上都添加了 auth:api 中间件。

Laravel-Api 使用的包

Laravel 框架
Dimsav / laravel-translatable

变更日志

请参阅 CHANGELOG 了解最近更改的详细信息。

贡献

请参阅 CONTRIBUTINGCODE_OF_CONDUCT 了解详细信息。

安全

如果您发现任何安全相关的问题,请通过电子邮件 security@swis.nl 而不是使用问题跟踪器。

鸣谢

许可

MIT 许可证 (MIT)。请参阅 许可文件 了解更多信息。

SWIS

SWIS 是一家来自荷兰莱顿的 Web 代理机构。我们热爱与开源软件合作。