Plugins
When customizing collections, it can be quite common to need to perform the same tasks on multiple fields and collections.
Plugins are the answer to that need, and you are strongly encouraged to use them everywhere you notice that your customization files could benefit from code factorization.
Plugins are used by either importing a module, or installing the relevant package, and then calling the
use()
method.Depending on the plugin, options may be provided.
<?php
use ForestAdmin\AgentPHP\Agent\Utils\Env;
use ForestAdmin\AgentPHP\DatasourceCustomizer\CollectionCustomizer;
use ForestAdmin\AgentPHP\DatasourceDoctrine\DoctrineDatasource;
use ForestAdmin\SymfonyForestAdmin\Service\ForestAgent;
use MyNamespace\Plugins\CreateFileField;
use MyNamespace\Plugins\RemoveTimestamps;
// The use() method can be called both on the agent and on collections
return static function (ForestAgent $forestAgent) {
$forestAgent->addDatasource(
new DoctrineDatasource($forestAgent->getEntityManager(), [
'url' => Env::get('DATABASE_URL'),
]),
)
// Some plugins do not require options
->use(RemoveTimestamps::class)
// Others do
->customizeCollection(
'Book',
fn (CollectionCustomizer $builder) => $builder->use(
CreateFileField::class,
['fieldname': 'avatar']
)
)
A plugin is nothing more than a
class
that implements our Plugin interface
and can perform customizations.<?php
namespace ...;
use ForestAdmin\AgentPHP\DatasourceCustomizer\CollectionCustomizer;
use ForestAdmin\AgentPHP\DatasourceCustomizer\DatasourceCustomizer;
class RemoveTimestamps implements Plugin
{
public function run(DatasourceCustomizer $datasourceCustomizer, ?CollectionCustomizer $collectionCustomizer = null, $options = []): void
{
// Allow the plugin to be used both on the dataSource or on individual collections
$collections = $collectionCustomizer ? [$collectionCustomizer] : $datasourceCustomizer->getCollections();
// Remove fields
foreach ($datasourceCustomizer->getCollection() as $currentCollection) {
$currentCollection->removeField('createdAt');
$currentCollection->removeField('updatedAt');
}
}
}
Last modified 18d ago