yceruto/micro-symfony

Micro-Symfony 工具

v4.0.3 2024-06-28 19:22 UTC

README

为 Symfony 应用程序提供类辅助工具。

ci

安装

composer require yceruto/micro-symfony

AbstractBundle

在您的 Symfony 应用程序中,Bundle 是非常重要的代码部分,通常需要特殊的配置和 DI 扩展才能实现目标。

从这个角度来看,这个 AbstractBundle 类将帮助您快速创建一个简洁且小的 Bundle,专注于您需要定义和导入的内容,通过提供有用的快捷方式和配置器来实现。

namespace Acme\FooBundle;

use MicroSymfony\Component\Config\Definition\Configurator\DefinitionConfigurator;
use MicroSymfony\Component\HttpKernel\Bundle\AbstractBundle;
// ...

class AcmeFooBundle extends AbstractBundle
{
    protected string $extensionAlias = ''; // set here the custom extension alias, e.g. 'foo' (default 'acme_foo')

    public function configuration(DefinitionConfigurator $definition): void
    {
        // loads config definition from a file
        $definition->import('../config/definition.php');

        // loads config definition from multiple files (when it's too long you can split it)
        $definition->import('../config/definition/*.php');

        // defines config directly when it's short
        $definition->rootNode()
            ->children()
                ->scalarNode('foo')->defaultValue('bar')->end()
            ->end()
        ;
    }

    public function prependExtension(ContainerConfigurator $container, ContainerBuilder $builder): void
    {
        // prepend config from plain array
        $builder->prependExtensionConfig('framework', [
            'cache' => ['prefix_seed' => 'foo/bar'],
        ]);

        // prepend config from a config file
        $container->import('../config/packages/cache.yaml');
    }

    public function loadExtension(array $config, ContainerConfigurator $container, ContainerBuilder $builder): void
    {
        $container->parameters()
            ->set('foo', $config['foo']);

        $container->import('../config/services.php');

        if ('bar' === $config['foo']) {
            $container->services()
                ->set(Foobar::class);
        }
    }
}

使用这个类,您不需要为 ExtensionConfiguration 创建单独的类。此外,所有方法都包含配置器,允许您导入任何支持的格式(yamlxmlphp 等)的定义或配置文件。

当您从文件导入配置定义时,它应该看起来像这样

// acme/foo_bundle/config/definition.php

use MicroSymfony\Component\Config\Definition\Configurator\DefinitionConfigurator;

return static function (DefinitionConfigurator $definition) {
    $definition->rootNode()
        ->children()
            ->scalarNode('foo')->defaultValue('bar')->end()
        ->end()
    ;
};

AbstractExtension

在某些情况下,主要是对于无 Bundle 方法,您可能希望在不使用 Bundle 类的情况下将 DI 扩展添加到您的应用程序中。这个 AbstractExtension 类将帮助您通过提供相同的快捷方式和配置器来简化扩展定义。

namespace App\FooModule\Infrastructure\Symfony\DependecyInjection;

use MicroSymfony\Component\Config\Definition\Configurator\DefinitionConfigurator;
use MicroSymfony\Component\DependencyInjection\Extension\AbstractExtension;
// ...

class FooExtension extends AbstractExtension
{
    public function configuration(DefinitionConfigurator $definition): void
    {
        // loads config definition from a file
        $definition->import('../../config/definition.php');

        // loads config definition from multiple files (when it's too long you can split it)
        $definition->import('../../config/definition/*.php');

        // defines config directly when it's short
        $definition->rootNode()
            ->children()
                ->scalarNode('foo')->defaultValue('bar')->end()
            ->end()
        ;
    }

    public function prependExtension(ContainerConfigurator $container, ContainerBuilder $builder): void
    {
        // prepend config from plain array
        $builder->prependExtensionConfig('framework', [
            'cache' => ['prefix_seed' => 'foo/bar'],
        ]);

        // prepend config from a config file
        $container->import('../../config/packages/cache.yaml');
    }

    public function loadExtension(array $config, ContainerConfigurator $container, ContainerBuilder $builder): void
    {
        $container->parameters()
            ->set('foo', $config['foo']);

        $container->import('../../config/services.php');

        if ('bar' === $config['foo']) {
            $container->services()
                ->set(Foobar::class);
        }
    }
}

您可以直接通过这种方式将扩展注册到 Kernel 中

class Kernel extends BaseKernel
{
    protected function build(ContainerBuilder $container): void
    {
        $container->registerExtension(new FooExtension());
    }
}

MicroKernelTrait

这个类是基础 Kernel + MicroKernelTrait 的实现,允许您为您的云工作者、微服务或任何其他小型应用程序创建一个单一“单文件”应用程序。

// index.php

use MicroSymfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Component\HttpKernel\Kernel;

class StripeWebhookEventSubscriber extends Kernel
{
    use MicroKernelTrait;

    #[Route('/', methods: 'GET')]
    public function __invoke(Request $request, NotifierInterface $notifier): Response
    {
        // parse the webhook event and notify the user...
    
        return new Response('OK');
    }
}

return static function (array $context) {
    $kernel = new StripeWebhookEventSubscriber($context['APP_ENV'], (bool) $context['APP_DEBUG']);

    return \PHP_SAPI === 'cli' ? new Application($kernel) : $kernel;
};

您可以使用与控制台应用程序相同的 index.php 来执行常见的缓存清除操作或其他您需要运行的任何命令。

$ php index.php cache:clear

Symfony 6.1 支持

此功能已完全实现,自 Symfony 6.1 以来,因此您可以在相应升级后从依赖项中删除此包。

Symfony 7.1 支持

prependExtension 中的 $container->import() 方法在 Symfony 7.1 中得到实现,因此您可以在相应升级后从依赖项中删除此包。

Symfony 7.2 支持

MicroKernelTrait 的可选功能在 Symfony 7.2 中得到实现,因此您可以在相应升级后从依赖项中删除此包。

升级说明

此包中包含的所有类都注册在 MicroSymfony 命名空间下,但它们遵循与 Symfony 相同的组织结构。因此,要升级,只需从所有导入的类中删除 Micro 前缀,一切应该保持与之前相同。

-use MicroSymfony\Component\DependencyInjection\Extension\AbstractExtension;
+use Symfony\Component\DependencyInjection\Extension\AbstractExtension;

许可证

此软件根据 MIT 许可证 发布。