swisnl / json-api-server
Requires
- php: >=7.2|^8.0
- ext-json: *
- astrotomic/laravel-translatable: ^11.6
- laravel/framework: ^6.0|^7.0|^8.0|^9.0
Requires (Dev)
- filp/whoops: ~2.0
- friendsofphp/php-cs-fixer: ^2.16
- mockery/mockery: ^1.0
- orchestra/testbench: ^4.0|^5.0|^6.0
- phpunit/php-code-coverage: ^7.0
- phpunit/phpunit: ^8.0
- spatie/phpunit-watcher: ^1.3
- squizlabs/php_codesniffer: ^3.5
This package is auto-updated.
Last update: 2023-02-07 15:48:50 UTC
README
🚨 此包已被废弃 🚨
我们不再在我们自己的项目中使用此包,并且有许多更好的替代方案,因此我们选择废弃它。我们建议使用 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 了解最近发生了哪些变化。
贡献
请参阅 CONTRIBUTING 和 CODE_OF_CONDUCT 以获取详细信息。
安全
如果你发现任何与安全相关的问题,请通过电子邮件 security@swis.nl 联系,而不是使用问题跟踪器。
致谢
许可证
MIT 许可证 (MIT)。请参阅 许可证文件 了解更多信息。
SWIS
SWIS 是一家来自荷兰莱顿的 Web 代理机构。我们热爱与开源软件合作。