william/laravel-rigger

laravel的Rigger

0.0.14 2018-04-08 15:47 UTC

This package is auto-updated.

Last update: 2024-09-28 04:00:23 UTC


README

Laravel Rigger 受facebook/graphql的启发,后者是一种用于API的查询语言。但我认为它在Web开发领域的粒度太细了。以实体作为查询的最小单位,可以更快速地基于必要的配置生成RESTful后端,这些配置描述了实体和关系。

目录

安装

Composer

composer require william/laravel-rigger

Laravel

仅支持 Laravel >= 5.5,ServiceProvider 将自动附加。发布实体配置是必要的

php artisan vendor:publish --provider "WilliamWei\LaravelRigger\Providers\LaravelRiggerProvider"

这将生成 config/entities.phpconfig/rigger.php 文件。然后注册 RouteServiceProvider 中的路由

/**
 * Define the routes for the application.
 *
 * @return void
 */
public function map()
{
    $this->mapApiRoutes();

    $this->mapWebRoutes();

    Rigger::routes();
}

您可以使用此命令来检查生成的路由。

php artisan route:list

实体描述

所有需要由 rigger 处理的模型/实体都应该在 config/entities.php 中定义。

关系

支持四种关系:hasOne belongsTo hasMany belongsToMany。这些数组中的项可以是数组或字符串。以 User 为例,User 可能通过 user_role 表拥有多个 Role,因此您可以这样定义它

'belongsToMany' =>  [
    'roles',
]

如果您想修改连接表,您可以使用数组

'belongsToMany' =>  [
    ['roles', 'model_has_roles', 'model_id', 'role_id'],
]

所有这些定义都与https://laravel.net.cn/docs/5.5/eloquent-relationships中的文档一致

查询

这部分由andersao/l5-repository提供支持,它最吸引人的功能是允许前端执行动态搜索,过滤数据并自定义查询。请参阅参考

可以通过这种方式搜索的字段应定义在 config/entities.php 中。例如

'user'  =>  [
    'searchableFields'    =>  [
        'name',
    ],
]

包含

这部分由spatie/laravel-fractal提供支持,它允许前端包含(即嵌入、嵌套或侧加载)复杂数据结构的关系。例如,当您查询 /users 时,您可能同时想知道他们的角色信息。因此,您可以添加 include 参数,例如 /users?include=roles

{
	"data": [{
		"id": 1,
		"name": "rigger",
		"email": "rigger@email.com",
		"password": "rigger",
		"remember_token": "jsdklfjlsdjfl",
		"created_at": "2018-02-09 00:00:00",
		"updated_at": "2018-02-09 00:00:00",
		"roles": {
			"data": [{
				"id": 1,
				"name": "admin",
				"guard_name": "api",
				"created_at": "2018-02-09 00:00:00",
				"updated_at": "2018-02-09 00:00:00",
				"pivot": {
					"model_id": 1,
					"role_id": 1
				}
			}]
		}
	}]
}

所有在 hasOne belongsTo hasManybelongsToMany 中定义的关系都可以通过这种方式检索。如果您想添加一些限制,您可以在实体中添加 availableIncludes 数组。如果是这样,即使它们在关系中定义,也只解析数组中的键。

验证和授权

Rigger 使用 spatie/laravel-permission 作为基本验证器。Rigger 中有三个控制层:全局层、实体层和动作层。在每个层中,都存在两个关键字 authorizeauthenticate 来控制行为。authorize 描述了需要哪些权限或角色,而 authenticate 确定用户是否需要登录。

authenticate

只能设置 truefalse

authorize

'authorized'    =>  [
    'role'          =>  'admin',
    'permission'    =>  'update-user'
]

rolepermission 都受支持。您还可以在权限中设置占位符 ${action}${resource}。例如,如果您在用户项中将 permission 设置为 ${action}-${resource},则在访问 GET /users 时,需要权限 index-user

三个控制层

在访问特定操作时,它会检查该资源是否有详细的操作控制,如果有,则解析它。如果没有,它将使用实体控制。但是,如果实体控制不存在,则将激活全局控制,该控制位于 rigger.php