krasnikov / json-api-server
只需几分钟即可在Laravel中设置JSON API。
Requires
- php: >=7.1.3
- sofa/eloquence-mappable: ^5.6
- spatie/laravel-translatable: ^4.1
Requires (Dev)
- filp/whoops: ~2.0
- friendsofphp/php-cs-fixer: ^2.4
- graham-campbell/testbench: ^4.0|^5.1
- mockery/mockery: ^1.0
- phpunit/php-code-coverage: ^5.3|^6.0
- phpunit/phpunit: ^7.0|^6.1
- spatie/phpunit-watcher: ^1.3
- squizlabs/php_codesniffer: ^2.3
README
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 了解最近更改的详细信息。
贡献
请参阅 CONTRIBUTING 和 CODE_OF_CONDUCT 了解详细信息。
安全
如果您发现任何安全相关的问题,请通过电子邮件 security@swis.nl 而不是使用问题跟踪器。
鸣谢
许可
MIT 许可证 (MIT)。请参阅 许可文件 了解更多信息。
SWIS
SWIS 是一家来自荷兰莱顿的 Web 代理机构。我们热爱与开源软件合作。