Skip to content

Commit

Permalink
Bundle configuration and DI
Browse files Browse the repository at this point in the history
  • Loading branch information
loicsapone committed Apr 24, 2024
1 parent cc49ce7 commit 469bae0
Show file tree
Hide file tree
Showing 6 changed files with 153 additions and 0 deletions.
1 change: 1 addition & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
"symfony/dependency-injection": "^6.4|^7.0",
"symfony/http-foundation": "^6.4|^7.0",
"symfony/http-kernel": "^6.4|^7.0",
"symfony/options-resolver": "^6.4|^7.0",
"symfony/routing": "^6.4|^7.0",
"symfony/ux-live-component": "^2.16",
"twig/twig": "^3.0.4"
Expand Down
75 changes: 75 additions & 0 deletions src/MezcalitoFileManagerBundle.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,83 @@

namespace Mezcalito\FileManagerBundle;

use Mezcalito\FileManagerBundle\Filesystem\Filesystem;
use Mezcalito\FileManagerBundle\Filesystem\Storage;
use Mezcalito\FileManagerBundle\Provider\Factory\LocalFilesystemProviderFactory;
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
use Symfony\Component\Config\Definition\Configurator\DefinitionConfigurator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\HttpKernel\Bundle\AbstractBundle;
use Symfony\Component\OptionsResolver\OptionsResolver;

class MezcalitoFileManagerBundle extends AbstractBundle
{
protected string $extensionAlias = 'mezcalito_filemanager';

/** @var LocalFilesystemProviderFactory[] */
private readonly array $providerFactories;

public function __construct()
{
$this->providerFactories = [
new LocalFilesystemProviderFactory(),
];
}

public function loadExtension(array $config, ContainerConfigurator $container, ContainerBuilder $builder): void
{
foreach ($config['storages'] as $storageName => $storageConfig) {
$providerDefinition = null;
foreach ($this->providerFactories as $factory) {
if ($factory->support($storageConfig['provider'])) {
$resolver = new OptionsResolver();
$factory->configureResolver($resolver);

$providerDefinition = $factory->createDefinition($resolver->resolve($storageConfig['options']));
}
}

if (null === $providerDefinition) {
throw new \LogicException('Provider "'.$storageConfig['provider'].'" does not exist.');
}

$builder->setDefinition('mezcalito_filemanager.provider.'.$storageName, $providerDefinition);

$builder->register('mezcalito_filemanager.storage.'.$storageName, Storage::class)
->setArguments([
new Reference('mezcalito_filemanager.provider.'.$storageName),
]);

$builder->register('mezcalito_filemanager.filesystem.'.$storageName, Filesystem::class)
->setArguments([
new Reference('mezcalito_filemanager.storage.'.$storageName),
]);
}
}

public function configure(DefinitionConfigurator $definition): void
{
/** @var ArrayNodeDefinition $rootNode */
$rootNode = $definition->rootNode();
$rootNode
->fixXmlConfig('storage')
->children()
->arrayNode('storages')
->useAttributeAsKey('name')
->arrayPrototype()
->performNoDeepMerging()
->children()
->scalarNode('provider')->isRequired()->end()
->arrayNode('options')
->variablePrototype()->end()
->defaultValue([])
->end()
->end()
->end()
->end()
->end()
;
}
}
40 changes: 40 additions & 0 deletions src/Provider/Factory/LocalFilesystemProviderFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?php

/*
* This file is part of the Mezcalito UX FileManager project.
*
* (c) Mezcalito <dev@mezcalito.fr>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

declare(strict_types=1);

namespace Mezcalito\FileManagerBundle\Provider\Factory;

use Mezcalito\FileManagerBundle\Provider\LocalFilesystemProvider;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\OptionsResolver\OptionsResolver;

class LocalFilesystemProviderFactory implements ProviderFactoryInterface
{
public function support(string $name): bool
{
return 'local' === $name;
}

public function configureResolver(OptionsResolver $resolver): void
{
$resolver->setRequired('path');
$resolver->setAllowedTypes('path', 'string');
}

public function createDefinition(array $options): ?Definition
{
$definition = new Definition(LocalFilesystemProvider::class);
$definition->setArgument(0, $options['path']);

return $definition;
}
}
26 changes: 26 additions & 0 deletions src/Provider/Factory/ProviderFactoryInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php

/*
* This file is part of the Mezcalito UX FileManager project.
*
* (c) Mezcalito <dev@mezcalito.fr>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

declare(strict_types=1);

namespace Mezcalito\FileManagerBundle\Provider\Factory;

use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\OptionsResolver\OptionsResolver;

interface ProviderFactoryInterface
{
public function support(string $name): bool;

public function configureResolver(OptionsResolver $resolver): void;

public function createDefinition(array $options): ?Definition;
}
11 changes: 11 additions & 0 deletions tests/TestApplication/src/Kernel.php
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,17 @@ protected function configureContainer(ContainerConfigurator $container): void
'default_path' => '%kernel.project_dir%/tests/TestApplication/templates',
]);

$container->extension('mezcalito_filemanager', [
'storages' => [
'local' => [
'provider' => 'local',
'options' => [
'path' => '%kernel.project_dir%/tests/fixtures/storages/local',
],
],
],
]);

$container->services()
->defaults()
->autowire()
Expand Down
Empty file.

0 comments on commit 469bae0

Please sign in to comment.