antstudiocz / compiler-extension
Requires
- php: ^8.0
- nette/application: ^3
- nette/bootstrap: ^3.1.2
- nette/di: ^3.0.14
Requires (Dev)
- latte/latte: ^3.0 || ^2.4
- nette/tester: ^2.4
- php-parallel-lint/php-parallel-lint: ^1.3
- slevomat/coding-standard: ^7.0
README
如果你有一个结构复杂的项目,包含大量的包(DIC 扩展),那么你需要设置很多东西,这可能会相当困难。但使用这个扩展就不会这样。你只需要使用 Adeira\ConfigurableExtensionsExtension
代替默认的 ExtensionsExtension
,如下所示(可能是在 bootstrap.php
中):
$configurator->defaultExtensions['extensions'] = \Adeira\ConfigurableExtensionsExtension::class;
这个新的扩展将负责管理你的包中的配置文件。接下来,如果你想为扩展使用自定义配置,只需使用 provideConfig
方法。
<?php namespace App\Articles\DI; class ArticlesExtension extends \Adeira\CompilerExtension { public function provideConfig() { return __DIR__ . '/config.neon'; } public function beforeCompile() { $this->setMapping(['Articles' => 'App\Articles\*Module\Presenters\*Presenter']); } }
你不需要扩展 Adeira\CompilerExtension
,但是有一个有用的助手函数 setMapping()
(它只设置自定义的展示者映射)。但是,provideConfig
方法也可以与 Nette\DI\CompilerExtension
的子类一起工作。为什么这如此有趣?想象一下,在你的应用程序中(通过 Nette\DI\Compiler::addConfig
添加到启动器中)有这个配置:
parameters: key1: value1 key2: value2 services: - DefaultService named: Tests\Service extensions: ext2: CustomExtension2 ext2: ext_key1: ext_value1 ext_key2: ext_value2 application: mapping: *: *
现在,你将使用 provideConfig
方法在你的 DIC 扩展中添加另一个配置。
parameters: key2: overridden key3: value3 services: - Tests\TestService named: Service2 ext2: ext_key2: overridden ext_key3: ext_value3 latte: macros: - App\Grid\Latte\Macros
结果是什么?现在有三个全局参数。
parameters: key1: value1 key2: overridden key3: value3
正如你所见,你的自定义 DIC 扩展具有优先级。扩展参数(ext2
)的行为完全相同。那么服务呢?正如你所期待的,将有三个服务。
- DefaultService named: Service2 - Tests\TestService
下面是最有趣的部分。如果你有很多扩展,使用自定义配置文件是一个好主意(简单易懂)。但是,从 neon 文件中获取扩展配置可能很困难。在 Nette\DI\CompilerExtension
子类中,你可以简单地使用 $this->getConfig()
来获取与扩展相关的配置,但在 neon 中没有等效的操作。这个扩展为这种情况添加了特殊的语法。从前面的例子中,有三个与 ext2
扩展相关的选项。
ext2: ext_key1: ext_value1 ext_key2: overridden ext_key3: ext_value3
要获取第二个参数到服务中,使用这个:
services: - Tests\TestService(%%ext_key2%%)
记住,这只能在通过 provideConfig
方法添加的自定义配置下使用。它不会在启动文件中添加的配置(通过 Nette\DI\Compiler::addConfig
)中工作。这是因为只有在扩展下才可能从正确的扩展部分(在这种情况下是 ext2.ext_key2
)获取键。
实验性功能
这些功能目前默认未启用(但将来可能默认启用)。要现在启用实验性功能,你需要以不同的方式注册这个扩展。
$configurator->defaultExtensions['extensions'] = [\Adeira\ConfigurableExtensionsExtension::class, [TRUE]]; // Become superhero!
目前有一个名为 GroupedNeonAdapter
的东西。它允许你使用分组语法在 NEON 中编写服务定义。在此之前:
graphql: types: - Adeira\Connector\Devices\Infrastructure\Delivery\API\GraphQL\Type\WeatherStationRecordType - Adeira\Connector\Devices\Infrastructure\Delivery\API\GraphQL\Type\WeatherStationsConnectionType - Adeira\Connector\Devices\Infrastructure\Delivery\API\GraphQL\Type\WeatherStationsEdgeType - Adeira\Connector\Devices\Infrastructure\Delivery\API\GraphQL\Type\WeatherStationType
之后
graphql: types: - Adeira\Connector\Devices\Infrastructure\Delivery\API\GraphQL\Type\( # namespace must end with backslash WeatherStationRecordType WeatherStationsConnectionType WeatherStationsEdgeType WeatherStationType )
这个功能是可选的,并且只在通过 provideConfig
方法提供的 NEON 文件中工作。所有类都必须匿名注册。如果不可能,就别用这个功能。