spinen / laravel-formio
SPINEN的Laravel Formio包。
Requires
- php: >=8.1
- firebase/php-jwt: ^5.0
- guzzlehttp/guzzle: ^7.4.5
- laravel/framework: ^8|^9|^10
- laravel/pint: ^1.6
- nesbot/carbon: ^2.62.1
- vlucas/phpdotenv: ^5.0
Requires (Dev)
- mockery/mockery: ^1.5.1
- phpunit/phpunit: ^9.6.5
- psy/psysh: ^0.11.1
This package is auto-updated.
Last update: 2024-04-18 04:49:06 UTC
README
PHP包,用于与Formio接口
我们仅使用Laravel构建我们的应用程序,因此此包是以Laravel为背景编写的。我们已尝试使其在Laravel之外也能工作。如果社区有将此包拆分为两部分的请求,我们将考虑执行这项工作。
构建状态
分支 | 状态 | 覆盖率 | 代码质量 |
---|---|---|---|
开发 | |||
主分支 |
安装
安装Formio PHP包
$ composer require spinen/laravel-formio
该包使用Laravel的自动注册功能。
用法
主要类是Spinen\Formio\Client
。它使用3个参数进行构造...
-
array $config
- 配置属性。有关选项的详细列表,请参阅./config
目录中的formio.php
文件。 -
Guzzle $guzzle
-GuzzleHttp\Client
实例 -
Token $token
- [可选]Spinen\Formio\Token
实例
一旦创建了一个Client
实例,你就有以下方法...
-
addUser(FormioUser $user, $password = null)
- 将用户添加到Formio中的user
资源。如果没有提供密码,则使用配置中指定的默认密码。否则,生成一个32字符的随机字符串。一旦用户被添加到Formio,则将密码设置在$user
对象的formio_password
属性上,并在其上调用save
方法以持久化密码,以便将来与Formio进行交互。最后,将用户的JWT设置在$token
上,以便通过用户发起请求。 -
login(FormioUser $user = null)
- 如果提供了$user
,则使用$user
对象上getLoginData
方法提供的数组登录Formio。否则,登录配置中的管理员用户。 -
logout()
- 将$token
设为空 -
request($path, $data = [], $method = 'GET')
- 使用登录用户的JWT对Formio进行$path
的API调用,并使用$data
。 -
setConfigs(array $configs)
- 允许覆盖Client
实例上的$configs
。 -
sso(FormioUser $user)
- 如果$user
实例的formio_password
属性有值,则通过API从Formio获取JWT。否则,为用户生成一个自定义JWT。 -
uri($path = null)
- 为Formio服务器上的路径生成完整的URI。
Laravel
配置
-
您需要让您的
User
对象实现Spinen\Formio\Contracts\FormioUser
接口,以便它具有所需的方法。我们还包括了Spinen\Formio\Concerns\HasForms
特质,这将满足合同要求。<?php namespace App; use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Spinen\Formio\Concerns\HasForms; use Spinen\Formio\Contracts\FormioUser; class User extends Authenticatable implements FormioUser { use FormioUser, Notifiable; // ... }
-
将适当的值添加到您的
.env
最小密钥
FORMIO_ADMIN_PASSWORD=<admin password in formio> FORMIO_ADMIN_USERNAME=<admin username in formio> FORMIO_URL=<url to formio>
可选密钥
FORMIO_JWT_ALGORITHM=<jwt algorithm> # Default: HS256 FORMIO_JWT_SECRET=<jwt secret> # Default: --- change me now --- (same as docker image) FORMIO_PROJECT_ID=<project id> # Default: null FORMIO_USER_FORM=<id of the user resource> # Default: null (Will lookup the id for "user" if null) FORMIO_USER_ROLES=<comma seperated list of user roles> # Default: null (Will lookup Authenticated if null)
-
[可选] 发布配置和迁移
配置
可以通过运行以下命令将名为
formio.php
的配置文件发布到config/
目录...php artisan vendor:publish --tag=formio-config
迁移
可以通过运行以下命令发布迁移文件...
php artisan vendor:publish --tag=formio-migrations
JS API
默认情况下,在 /api/formio/jwt
路径处发布了一个路由,该路由位于 api
& auth:api
中间件之后,因此从您的js代码中,您可以从该路由请求已认证用户的JWT...
axios.get('/api/formio/jwt') .then(({ data: { data: { expires_at, jwt } } }) => { this.jwt = jwt; this.jwt_expires_at = expires_at; // Do something with the form like Formio.setToken(jwt) }) .catch((e) => { this.errors.push(e); });
以获取如下负载...
{ "data": { "expires_at": "2019-10-04T20:29:58+00:00", "jwt": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHRlcm5hbCI6dHJ1ZSwiZm9ybSI6eyJfaWQiOiI1ZDkxNmIyNjBlYTBjNzAwMWE4ZWVlM2MifSwidXNlciI6eyJfaWQiOiJleHRlcm5hbCIsImRhdGEiOnsiZW1haWwiOiJvamFjb2JzQGV4YW1wbGUub3JnIiwiZmlyc3ROYW1lIjoiQXJ2aWQiLCJsYXN0TmFtZSI6IlJ1ZWNrZXIifSwicm9sZXMiOlsiNWQ5MTZiMjYwZWEwYzcwMDFhOGVlZTNhIl19LCJpYXQiOjE1NzAxMzg3MjIsImV4cCI6MTU3MDE1MzEyMn0.ZxWTJIteHXomGz1F7yYjSJcXvWLZQZYRrPN4cKB3KAk" } }
示例
以下是获取管理员角色的示例
$ php artisan tinker Psy Shell v0.9.9 (PHP 7.2.14 — cli) by Justin Hileman >>> $formio = app(Spinen\Formio\Client::class) => Spinen\Formio\Client {#3534 +token: Spinen\Formio\Token {#3528 // ... }, } >>> $formio->login() => Spinen\Formio\Client {#3534 +token: Spinen\Formio\Token {#3528 // ... +user: [ "_id" => "5d916b270ea0c7001a8eee4a", "owner" => null, "roles" => [ "5d916b260ea0c7001a8eee39", ], "form" => "5d916b260ea0c7001a8eee3d", "data" => [ "email" => "admin@domain.com", ], // ... ], }, } >>> $formio->request('/role') => [ [ "_id" => "5d916b260ea0c7001a8eee39", "description" => "A role for Administrative Users.", "default" => false, "admin" => true, "title" => "Administrator", "machineName" => "administrator", "created" => "2019-09-30T02:40:38.377Z", "modified" => "2019-09-30T02:40:38.491Z", ], [ "_id" => "5d916b260ea0c7001a8eee3b", "description" => "A role for Anonymous Users.", "default" => true, "admin" => false, "title" => "Anonymous", "machineName" => "anonymous", "created" => "2019-09-30T02:40:38.735Z", "modified" => "2019-09-30T02:40:38.737Z", ], [ "_id" => "5d916b260ea0c7001a8eee3a", "description" => "A role for Authenticated Users.", "default" => false, "admin" => false, "title" => "Authenticated", "machineName" => "authenticated", "created" => "2019-09-30T02:40:38.648Z", "modified" => "2019-09-30T02:40:38.682Z", ], ] >>>
以下是获取具有自定义JWT的用户表单名的示例
$ php artisan tinker >>> $user = factory(App\User::class)->create() => App\User {#3565 first_name: "Arvid", last_name: "Ruecker", email: "ojacobs@example.org", email_verified_at: "2019-10-03 21:38:33", updated_at: "2019-10-03 21:38:33", created_at: "2019-10-03 21:38:33", id: 1, } >>> $formio = app(Spinen\Formio\Client::class) => Spinen\Formio\Client {#3697 +token: Spinen\Formio\Token {#3530 // ... }, } >>> $formio->sso($user) => Spinen\Formio\Client {#3697 +token: Spinen\Formio\Token {#3530 +expires_at: Carbon\Carbon @1570153122 {#3695 date: 2019-10-04 01:38:42.0 +00:00, }, +issued_at: Carbon\Carbon @1570138722 {#3619 date: 2019-10-03 21:38:42.0 +00:00, }, +jwt: "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHRlcm5hbCI6dHJ1ZSwiZm9ybSI6eyJfaWQiOiI1ZDkxNmIyNjBlYTBjNzAwMWE4ZWVlM2MifSwidXNlciI6eyJfaWQiOiJleHRlcm5hbCIsImRhdGEiOnsiZW1haWwiOiJvamFjb2JzQGV4YW1wbGUub3JnIiwiZmlyc3ROYW1lIjoiQXJ2aWQiLCJsYXN0TmFtZSI6IlJ1ZWNrZXIifSwicm9sZXMiOlsiNWQ5MTZiMjYwZWEwYzcwMDFhOGVlZTNhIl19LCJpYXQiOjE1NzAxMzg3MjIsImV4cCI6MTU3MDE1MzEyMn0.ZxWTJIteHXomGz1F7yYjSJcXvWLZQZYRrPN4cKB3KAk", +jwt_obj: {#3575 +"external": true, +"form": {#3535 +"_id": "5d916b260ea0c7001a8eee3c", }, +"user": {#3676 +"_id": "external", +"data": {#3527 +"email": "ojacobs@example.org", +"firstName": "Arvid", +"lastName": "Ruecker", }, +"roles": [ "5d916b260ea0c7001a8eee3a", ], }, +"iat": 1570138722, +"exp": 1570153122, }, +user: [ "email" => "ojacobs@example.org", "firstName" => "Arvid", "lastName" => "Ruecker", ], }, } >>> collect($formio->request('/form'))->pluck('name') => Illuminate\Support\Collection {#3536 all: [ "user", "admin", "userLogin", "adminLogin", "userRegister", ], } >>>
通用PHP
示例
以下是获取管理员当前用户的示例
$ psysh Psy Shell v0.9.9 (PHP 7.2.22 — cli) by Justin Hileman >>> $config = [ "admin" => [ "password" => "password", "login" => [ "path" => "/admin/login", ], "username" => "admin@domain.com", ], "jwt" => [ "algorithm" => "HS256", "secret" => "--- change me now ---", ], "project" => [ "id" => null, ], "url" => "https://:3001", "user" => [ "form" => null, "login" => [ "path" => "/user/login", ], "register" => [ "default_password" => null, "path" => "/user/register", ], "roles" => [], "sync" => false, ], ] >>> $guzzle = new GuzzleHttp\Client(); => GuzzleHttp\Client {#2346} >>> $formio = new Spinen\Formio\Client($config, $guzzle); => Spinen\Formio\Client {#2364 +token: Spinen\Formio\Token {#2362 // ... }, } >>> $formio->login(); => Spinen\Formio\Client {#2364 +token: Spinen\Formio\Token {#2362 // ... +user: [ "_id" => "5d916b270ea0c7001a8eee4a", "owner" => null, "roles" => [ "5d916b260ea0c7001a8eee39", ], "form" => "5d916b260ea0c7001a8eee3d", "data" => [ "email" => "admin@domain.com", ], "access" => [], "externalIds" => [], "created" => "2019-09-30T02:40:39.478Z", "modified" => "2019-09-30T02:40:39.482Z", ], }, } >>> $formio->request('/current') => [ "_id" => "5d916b270ea0c7001a8eee4a", "owner" => null, "roles" => [ "5d916b260ea0c7001a8eee39", ], "form" => "5d916b260ea0c7001a8eee3d", "data" => [ "email" => "admin@domain.com", ], "access" => [], "externalIds" => [], "created" => "2019-09-30T02:40:39.478Z", "modified" => "2019-09-30T02:40:39.482Z", ] >>>