This is the official documentation of the forestadmin/laravel-forestadmin v2+ and forestadmin/symfony-forestadmin PHP agents.
Steps
Creating a custom data source will require you to work on the 3 following steps:
Declare the structure of the data
Declare the API capabilities
Code a translation layer
Minimal example
<?phpuseForestAdmin\AgentPHP\DatasourceToolkit\Collection;useForestAdmin\AgentPHP\DatasourceToolkit\Components\Caller;useForestAdmin\AgentPHP\DatasourceToolkit\Components\Contracts\DatasourceContract;useForestAdmin\AgentPHP\DatasourceToolkit\Components\Query\Aggregation;useForestAdmin\AgentPHP\DatasourceToolkit\Components\Query\Filters\Filter;useForestAdmin\AgentPHP\DatasourceToolkit\Components\Query\Projection\Projection;useForestAdmin\AgentPHP\DatasourceToolkit\Schema\ColumnSchema;useGuzzleHttp\Client;// The real work is in writing this module// Expect a full featured query translation module to be over 1000 LOCsuseQueryGenerator;classMyCollectionextendsCollection{publicfunction__construct(DatasourceContract $datasource) {parent::__construct( $datasource,'MyCollection');$this->addField('id',newColumnSchema( columnType: 'Number',// As we are using the query translation strategy => define capabilities filterOperators: [],// field is not filterable isPrimaryKey: true, isReadOnly: true,// field is readonly isSortable: false // field is not sortable ));$this->addField('title',newColumnSchema( columnType: 'String', filterOperators: [], isPrimaryKey: false, isReadOnly: true, isSortable: false ));$this->client =newClient(['base_uri'=>'https://my-api/','timeout'=>5.0, ]); }publicfunctionlist(Caller $caller,Filter $filter,Projection $projection):array { $params =QueryGenerator::generateListQueryString($filter, $projection);try { $response =$this->client->get('my-collection', ['query'=> $params, ]); $body =json_decode($response->getBody()->getContents(), true);return $body['items'] ?? []; } catch (\Exception $e) {thrownew\RuntimeException('Failed to fetch items: '. $e->getMessage()); } }publicfunctionaggregate(Caller $caller,Filter $filter,Aggregation $aggregation,?int $limit = null) { $params =QueryGenerator::generateAggregateQueryString($filter, $aggregation, $limit);try { $response =$this->client->get('my-collection', ['query'=> $params, ]); $body =json_decode($response->getBody()->getContents(), true);return $body['items'] ?? []; } catch (\Exception $e) {thrownew\RuntimeException('Failed to fetch items: '. $e->getMessage()); } }}
<?phpuseCollections\MyCollection;useForestAdmin\AgentPHP\DatasourceToolkit\DataSource;classMyDataSourceextendsDataSource{publicfunction__construct() {parent::__construct();$this->addCollection(newMyCollection($this)); // List of your collections }
Implementing a data source using the "query translation" strategy is an advanced concept: you will need to have a deep understanding of Forest Admin internals.
This strategy is a good match when writing data sources for full-featured databases.
Before starting, it is highly advised to read and understand the following sections: