interitty / di
为卓越的 Nette\DI 容器提供一些额外功能。
v1.0.9
2024-08-30 12:10 UTC
Requires
- php: ~8.3
- dg/composer-cleaner: ~2.2
- nette/di: ~3.2, !=3.2.2
Requires (Dev)
- interitty/code-checker: ~1.0
- interitty/phpunit: ~1.0
- nette/application: ~3.2
- nette/bootstrap: ~3.2
- nette/caching: ~3.3
README
为卓越的 Nette\DI 容器提供一些额外功能。
要求
- PHP >= 8.3
安装
安装 interitty/di 的最佳方式是使用 Composer
composer require interitty/di
特性
抽象的 CompilerExtension
类提供了以标准方式处理默认参数、扩展它们和验证它们的方法。它还包含了一个帮助程序 setupServiceAlias
,简化了在服务已注册之前注册服务或其别名的过程。
文字工厂
为了生成更复杂的条目,可以使用 Nette\PhpGenerator\Literal
类。提供了一个辅助工厂 createLiteral
以便于工作。
示例:createLiteral
<?php
declare(strict_types=1);
namespace Interitty\Foo\Nette\DI;
use Interitty\DI\CompilerExtension;
use Nette\DI\Definitions\ServiceDefinition;
class FooExtension extends CompilerExtension
{
/**
* Foo helper
*
* @param ServiceDefinition $definition
* @return void
*/
protected function processFoo(ServiceDefinition $definition): void
{
$definition->addSetup('?', [$this->createLiteral('return ?;', [true])]);
}
}
注册帮助程序
有时在另一个扩展之前或之后按特定顺序直接注册扩展可能会有所帮助。为此目的,存在辅助方法 processRegisterAfter
和 processRegisterBefore
,可以在进程的构造函数或初始化阶段调用这些方法,以将扩展移动到确切的位置。
<?php
declare(strict_types=1);
namespace Interitty\Foo\Nette\DI;
use Interitty\DI\CompilerExtension;
class FooExtension extends CompilerExtension
{
/**
* @inheritdoc
*/
public function loadConfiguration(): void
{
parent::loadConfiguration();
$this->processRegisterAfter('services');
}
}
建议
它还包括以下建议
- 每个配置参数都应该定义为具有其名称的
CONFIG_*
常量。 - 每个配置参数都应该在
configSchema
或processConfig
方法中验证。 - 每个服务名称都应该定义为
PROVIDER_*
常量。 - 每个服务都应该在
setup*
方法中注册。 - 应在
beforeCompile
方法中调用设置方法。
示例:FooExtension
<?php
declare(strict_types=1);
namespace Interitty\Foo\Nette\DI;
use Interitty\Utils\Validators;
use Interitty\DI\CompilerExtension;
use function assert;
class FooExtension extends CompilerExtension
{
/** All config parameter name constants */
const CONFIG_FOO = 'foo';
/** All available provider name constants */
const PROVIDER_BAR = 'bar';
/**
* @var mixed[]
*/
protected $defaults = [
self::CONFIG_FOO => 'foo',
];
/**
* @inheritdoc
*/
public function beforeCompile(): void
{
$this->setupFoo();
}
/**
* @inheritdoc
*/
public function processConfig(): array
{
$config = parent::processConfig();
assert(Validators::check($config[self::CONFIG_FOO], 'string', self::CONFIG_FOO));
return $config;
}
// <editor-fold defaultstate="collapsed" desc="Helpers">
/**
* Bar setup helper
*
* @return void
*/
protected function setupBar(): void
{
if ($this->setupServiceAlias(Bar::class, self::PROVIDER_BAR) === false) {
$builder = $this->getContainerBuilder();
$builder->addDefinition($this->prefix(self::PROVIDER_BAR))
->setImplement(Bar::class)
->addSetup('setFoo', [$this->getConfigField(self::CONFIG_FOO));
}
}
}