PHP-DI говорит, что в файле определения отсутствует параметр - PullRequest
0 голосов
/ 04 июня 2019

Я новичок в PHP-DI и действительно не понимаю, что мне не хватает.

У меня есть контейнер:

$definitonFile = __DIR__ . '/app/etc/di_config.php';

$containerBuilder = new \DI\ContainerBuilder();
$containerBuilder->useAutowiring(true);
$containerBuilder->addDefinitions($definitonFile);
$container = $containerBuilder->build();
$container->call(["Vendor\MyTestClass", "getName"], []);

В файле определения:

return [
  'Logger' => DI\autowire()->constructor('app.log'),
];

И int MyTestClass

<?php

namespace Vendor;

use Monolog\Logger;

class MyTestClass
{
    /**
     * @var Logger
     */
    private $logger;

    public function __construct(Logger $logger)
    {
        $this->logger = $logger;
    }

    public function getName()
    {
        var_dump($this->logger);
    }

}

По какой-то причине я получаю это сообщение об ошибке:

Неустранимая ошибка: Uncaught DI \ Definition \ Exception \ InvalidDefinition: Запись «Vendor \ MyTestClass» не может быть разрешена: запись «Monolog \ Logger» не может быть разрешена: параметр $ name для __construct () не имеет ни определенного, ни предполагаемого значения Полное определение: Object (class = Monolog \ Logger lazy = false __construct ($name = # UNDEFINED # $ handlers = (значение по умолчанию) array () $ processors = (default value) array ())) Полное определение: Object (class = Vendor \ MyTestClass lazy = false __construct ($ logger = get (Monolog \ Logger)))) в /var/www/dmholding.lh/vendor/php-di/php-di/src/Definition/Exception/InvalidDefinition.php в строке 18

Я делаю точно так же, как в документация .

Может кто-нибудь взглянуть на это?

Ответы [ 2 ]

0 голосов
/ 04 июня 2019
return [
  'Logger' => DI\autowire()->constructor('app.log'),
];

Вы определяете Logger как имя класса, но кажется, что класс, который вы фактически внедрили, - Monolog\Logger.

0 голосов
/ 04 июня 2019

Я не вижу определяемый класс Logger. Смотрите этот пример в документации по PHP-DI.

<?php
// config.php

use Monolog\Logger;
use Monolog\Handler\StreamHandler;

return [
    // ...

    Psr\Log\LoggerInterface::class => DI\factory(function () {
        $logger = new Logger('mylog');

        $fileHandler = new StreamHandler('path/to/your.log', Logger::DEBUG);
        $fileHandler->setFormatter(new LineFormatter());
        $logger->pushHandler($fileHandler);

        return $logger;
    }),
];

http://php -di.org / док / лучший practices.html # с использованием-библиотеки

...