swisnl/json-api-server

此包已被废弃,不再维护。作者建议使用 laravel-json-api/laravel 包。

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

0.6.0 2023-02-07 15:46 UTC

README

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

🚨 此包已被废弃 🚨

我们不再在我们自己的项目中使用此包,并且有许多更好的替代方案,因此我们选择废弃它。我们建议使用 laravel-json-api/laravel 或其他替代方案。欢迎fork我们的代码并维护自己的副本。

Laravel JSON API 服务器

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

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

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

安装

通过 Composer

$ composer require swisnl/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/

这会生成以下文件

  • 一个优雅的模型
  • 一个翻译模型
  • 一个API控制器
    • 应该扩展BaseApiController
  • 一个路由文件,其中定义了所有CRUD端点
  • 为你模型创建的存储库
    • 可以扩展BaseApiRepository
  • 用于检查权限的策略
  • 1个用于检查用户是否有权限访问端点的测试

您将能够执行基本的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 json-api-server:generate-translation {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/swisnl/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,
]; 

请求和响应

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

在您的控制器中提供了几个响应方法。目前实现了以下响应方法

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={pageNumber}:决定分页应显示的页面。
  • ?per_page={amountToShowPerPage}:决定每页显示多少项。
  • ?ids={commaSeperatedIds}:检索属于指定ID的对象集合。
  • ?exclude_ids={commaSeperatedIds}:检索不属于指定ID的对象集合。
  • ?lang={language}:(需要configure-locale中间件)将PHP区域设置更改为所需语言,并自动翻译所有可翻译模型。
  • ?fields={columns}:检索特定列。
  • ?order_by_desc={column}:根据列降序排列。
  • ?order_by_asc={column}:根据列升序排列。

必需中间件

  • 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 框架
Astrotomic / laravel-translatable

变更日志

请参阅 CHANGELOG 了解最近发生了哪些变化。

贡献

请参阅 CONTRIBUTINGCODE_OF_CONDUCT 以获取详细信息。

安全

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

致谢

许可证

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

SWIS

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