yceruto / micro-symfony
Micro-Symfony 工具
Requires
- php: >=8.2
- symfony/config: ^7.1
- symfony/dependency-injection: ^7.1
- symfony/http-kernel: ^7.1
Requires (Dev)
- symfony/console: ^7.1
- symfony/expression-language: ^7.1
- symfony/framework-bundle: ^7.1
- symfony/phpunit-bridge: ^7.1
- symfony/routing: ^7.1
- symfony/yaml: ^7.1
Conflicts
README
为 Symfony 应用程序提供类辅助工具。
安装
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); } } }
使用这个类,您不需要为 Extension
或 Configuration
创建单独的类。此外,所有方法都包含配置器,允许您导入任何支持的格式(yaml
、xml
、php
等)的定义或配置文件。
当您从文件导入配置定义时,它应该看起来像这样
// 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 许可证 发布。