spinen/laravel-formio

此包已被放弃,不再维护。未建议替代包。

SPINEN的Laravel Formio包。

1.1.0 2023-03-18 02:26 UTC

README

Latest Stable Version Latest Unstable Version Total Downloads License

PHP包,用于与Formio接口

我们仅使用Laravel构建我们的应用程序,因此此包是以Laravel为背景编写的。我们已尝试使其在Laravel之外也能工作。如果社区有将此包拆分为两部分的请求,我们将考虑执行这项工作。

构建状态

分支 状态 覆盖率 代码质量
开发 Build Status Code Coverage Scrutinizer Code Quality
主分支 Build Status Code Coverage Scrutinizer Code Quality

安装

安装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

配置

  1. 您需要让您的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;
    
        // ...
    }
  2. 将适当的值添加到您的.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)
  3. [可选] 发布配置和迁移

    配置

    可以通过运行以下命令将名为 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",
   ]
>>>