adeira/compiler-extension

此软件包已废弃且不再维护。未建议替代软件包。

v2.1.1 2017-02-06 10:27 UTC

README

目前我没有时间、精力和金钱来维护这个项目。但是,如果这个项目对你很重要,并且你想成为赞助商或进一步开发它,请不要犹豫与我联系。否则,我无法保证这个仓库有光明的未来... :)

针对Nette框架的增强型CompilerExtension

Build Status

如果你有一个结构复杂的项目,有很多捆绑包(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文件中工作。所有类都必须匿名注册。如果不可能,则不要使用此功能。