PHP-DI не может быть разрешен: запись не может быть разрешена: параметр xxxxxx для __construct() не имеет значения, определенного или предполагаемого Полное определение

Просто выбросил это здесь, потому что я не мог найти много информации об этой ошибке, и мне потребовалось около 2 часов, чтобы найти ее. лицо ладони

В container.php -> DBService определяется как:

    DBServiceInterface::class => function (ContainerInterface $c) {
        return new DBService(
            $c->get('settings.database'), 
            $c->get(SessionInterface::class), 
            $c->get(ValidatorInterface::class)
    );
    },

Тип: DI\Definition\Exception\InvalidDefinition Сообщение: запись "PVS\HomeController" не может быть разрешена: запись "PVS\DBService\DBService" не может быть разрешена: параметр $settings of __construct() не имеет значения, определенного или предполагаемого Полное определение: Объект ( class = PVS\DBService\DBService lazy = false __construct( $settings = #UNDEFINED# $session = get(PVS\Helpers\Storage\Contracts\SessionInterface) $validator = get(PVS\Validation\Contracts\ValidatorInterface))) Полная определение: объект ( class = PVS\HomeController lazy = false __construct( $container = get(Psr\Container\ContainerInterface) $view = get(Slim\Views\Twig) $router = get(Slim\Router) $flash = get(Slim\Flash\Messages) $session = get(PVS\Helpers\Storage\Contracts\SessionInterface) $db = get(PVS\DBService\DBService))) Файл:

Поэтому я начал искать проблемы в моем контейнере или в самом DBService.php. Проблема была на самом деле в контроллере в первой строке сообщения об ошибке.

1 ответ

Решение

Конструктор HomeController был определен как:

public function __construct (ContainerInterface $container, 
    Twig $view, 
    Router $router, 
    Messages $flash, 
    SessionInterface $session, 
    DBService $db) {  <--- Problem here

Я изменил это на:

    public function __construct (ContainerInterface $container, 
    Twig $view, 
    Router $router, 
    Messages $flash, 
    SessionInterface $session, 
    DBServiceInterface $db) { <--- 

Обратите внимание, что теперь я вызываю интерфейс вместо конкретной реализации, и он соответствует контейнеру DI, опубликованному выше.

У меня было такое же исключение, и короче говоря, моя проблема заключалась в том, что класс унаследовал конструктор своего родителя и родителя __constructor не был публичным, но защищенным.

Может быть, это поможет кому-то еще сэкономить часы на исследованиях.

Другие вопросы по тегам