4

我正在尝试获取 PHP-DI 工作的基本示例,但我很容易被困在一个相当基本的示例中。我假设我在这里遗漏了一些简单的东西,但无法将其单独列出。

它没有识别 LoggerInterface 类型的提示,但这是直接从示例中提取的,所以我不明白我做错了什么。

当我从服务签名中删除 LoggerInterface 时,该示例运行良好。

服务等级:

<?php
namespace test\ServiceLayer;
class TestService extends BaseService{
  public function __construct(\Psr\Log\LoggerInterface $logger){}
}
?>

配置文件

<?php
use Monolog\Logger;
return [
    'TestService' => \DI\create(\test\ServiceLayer\TestService::class),
    Psr\Log\LoggerInterface::class => DI\factory(function () {
        $logger = new Logger('mylog');
        return $logger;
    }),
];
?>

用法:

<?php
$builder = new \DI\ContainerBuilder();
$builder->addDefinitions('config.php');
$container = $builder->build();
$service = $container->get('TestService');
?>

例外:

object(DI\Definition\Exception\InvalidDefinition)#115 (7) {
["message":protected]=> string(196) "Entry "TestService" 无法解析:__construct() 的参数 $logger 没有定义值或可猜测的完整定义:对象 (class = arkon\ServiceLayer\TestService lazy = false)"

4

1 回答 1

7

您正在使用create(),如果您希望条目自动装配,则需要使用autowire()

请参阅本文档

于 2018-03-29T09:55:42.590 回答