Skip to main content

Generator

Fusio contains a generator system which helps to generate operations, schemas and actions from different sources i.e. it can help to create an API from a database or import an OpenAPI specification. The following screenshot shows the generator form:

generator

Every generator has the following fields:

Base-Path

An API Base-Path under which all resources are created i.e. /v1/my_db

Scopes

Optional a comma separated list of scopes which are assigned to the routes.

Public

Whether all routes are public or private. By default all routes are private so they can only be invoked by an authorized user.

Class

Through this dropdown field you select the actual generator implementation. Depending on the generator you will get additional configuration fields which are required for the specific generator.

Development

You can also easily develop a custom generator i.e. if you want to import resources from a different system or specification. To build a Generator you need to create a class which implements the Fusio\Engine\Generator\ProviderInterface interface. The following Generator creates a route which simply outputs a static message.

<?php

namespace App;

use Fusio\Adapter\Util\Action\UtilStaticResponse;
use Fusio\Engine\Form\BuilderInterface;
use Fusio\Engine\Form\ElementFactoryInterface;
use Fusio\Engine\Generator\ProviderInterface;
use Fusio\Engine\Generator\SetupInterface;
use Fusio\Engine\ParametersInterface;
use Fusio\Model\Backend\ActionConfig;
use Fusio\Model\Backend\ActionCreate;
use Fusio\Model\Backend\OperationCreate;
use Fusio\Model\Backend\SchemaCreate;
use Fusio\Model\Backend\SchemaSource;

class MyGenerator implements ProviderInterface
{
public function getName(): string
{
return 'My-Generator';
}

public function setup(SetupInterface $setup, ParametersInterface $configuration): void
{
$operationId = 'My_Message';
$responseSchema = 'My_Schema';

$schema = new SchemaCreate();
$schema->setName($responseSchema);
$schema->setSource(SchemaSource::from($this->getMySchema()));
$setup->addSchema($schema);

$action = new ActionCreate();
$action->setName($operationId);
$action->setClass(UtilStaticResponse::class);
$action->setConfig(ActionConfig::from([
'response' => json_encode(['hello' => $configuration->get('message')]),
]));
$setup->addAction($action);

$operation = new OperationCreate();
$operation->setName('My_Operation');
$operation->setDescription('Returns a hello message');
$operation->setHttpMethod('GET');
$operation->setHttpPath('/my/endpoint');
$operation->setHttpCode(200);
$operation->setOutgoing($responseSchema);
$operation->setAction($operationId);
$setup->addOperation($operation);
}

public function configure(BuilderInterface $builder, ElementFactoryInterface $elementFactory): void
{
$builder->add($elementFactory->newInput('message', 'Message', 'The message'));
}

private function getMySchema(): array
{
return [
'definitions' => [
'Message' => [
'type' => 'object',
'properties' => [
'hello' => [
'type' => 'string'
]
]
],
],
'$ref' => 'Message',
];
}
}

To use this generator place this class at the file src/MyGenerator.php and register the class at the resources/container.php DI container s.


$services->set(App\MyGenerator::class);

After this you can select the provider at the backend s.

generator_custom

If you execute this provider you will get a simple operation which outputs the following JSON payload.

{
"hello": "World"
}