This is the official documentation of the forestadmin/laravel-forestadmin v2+ and forestadmin/symfony-forestadmin PHP agents.
When customizing your Agent behavior, it is quite common to have 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.
Minimal example
Using plugins
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.
<?phpuseForestAdmin\AgentPHP\Agent\Utils\Env;useForestAdmin\AgentPHP\DatasourceCustomizer\CollectionCustomizer;useForestAdmin\AgentPHP\DatasourceDoctrine\DoctrineDatasource;useForestAdmin\SymfonyForestAdmin\Service\ForestAgent;useMyNamespace\Plugins\CreateFileField;useMyNamespace\Plugins\RemoveTimestamps;// The use() method can be called both on the agent and on collectionsreturnstaticfunction (ForestAgent $forestAgent) { $forestAgent->addDatasource(newDoctrineDatasource($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']))
Writing plugins
A plugin is nothing more than a class that implements our Plugin interface and can perform customizations.
<?phpnamespace ...;useForestAdmin\AgentPHP\DatasourceCustomizer\CollectionCustomizer;useForestAdmin\AgentPHP\DatasourceCustomizer\DatasourceCustomizer;classRemoveTimestampsimplementsPlugin{ 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 fieldsforeach ($datasourceCustomizer->getCollection()as $currentCollection) { $currentCollection->removeField('createdAt'); $currentCollection->removeField('updatedAt'); } }}