繁体   English   中英

PHP-DI:注入构造函数的接口无法正确解析

[英]PHP-DI: Interface being injected into constructor won't resolve correctly

当注入到构造函数中时,我似乎无法让PHP-DI正确地将接口解析为其配置的类。 在下面的代码中,使用容器获取\\ Foo \\ IDog返回一个Poodle类,但是当使用容器获取\\ Foo \\ Kennel(在构造函数中具有\\ Foo \\ IDog时,它不再识别它已配置为返回一个贵宾犬和错误说:

"Entry "\Foo\Kennel" cannot be resolved: Entry "Foo\IDog" cannot be resolved: the class is not instantiable"

这是概念证明:

<?php
namespace Foo;

require(__DIR__ . "/vendor/autoload.php");

interface IDog {
    function bark();
}

class Poodle implements IDog {
    public function bark() {
        echo "woof!" . PHP_EOL;
    }
}

class Kennel {
    protected $dog;
    public function __construct(\Foo\IDog $dog) {
        $this->dog = $dog;
    }

    public function pokeDog() {
        $this->dog->bark();
    }
}

$containerBuilder = new \DI\ContainerBuilder();
$containerBuilder->addDefinitions([
    "\Foo\IDog" => \DI\autowire("\Foo\Poodle")
]);
$container = $containerBuilder->build();

//Works:
$mydog = $container->get("\Foo\IDog");
$mydog->bark();

//Does not work:
$kennel = $container->get("\Foo\Kennel");
$kennel->pokeDog();

奇怪的是,如果我从中删除所有命名空间,它就可以正常工作(这里没有命名空间: https : //gist.github.com/brentk/51f58fafeee8029d7e8b1e838eca3d5b )。

知道我在做什么错吗?

我认为这是因为您的类名称在您的配置中无效: "\\Foo\\IDog"无效,而"Foo\\IDog"无效。

在代码\\Foo\\IDog也可以,但是在字符串中,只有Foo\\IDog有效。

避免这种情况的安全方法是使用\\Foo\\IDog::class 这样,PHP会告诉您该类不存在。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM