如何使 PHP IDE 理解依赖注入容器?

2022-08-30 09:06:29

当前情况:我的项目中有依赖项,我通过使用依赖项注入来解决。我想通过使用依赖关系注入容器 (DIC) 来执行下一个逻辑步骤,以简化依赖项的管理并延迟加载类。

我查看了BucketPimplesfServiceContainer,进行了一些测试,并非常欣赏DIC的工作。我可能会选择Pimple,因为它的简单性和原始的力量。如果我没有遇到此问题:

由于DIC提供的抽象,我正在使用的IDE(PHPStorm)不再理解我的代码中发生了什么。它不明白$container['mailer']或$sc->mailer持有类对象。我也尝试了Netbeans IDE:同样的问题。

这对我来说确实是一个问题,因为我的IDE变得无用。在处理类时,我不想在没有代码提示,自动完成和重构工具的情况下进行编程。而且我不希望我的IDE在验证代码时发现各种误报。

所以我的问题是:有没有人处理过这个问题并找到了解决方案?


答案 1

您可以“手动”定义变量的类:

/** @var YourClassType $mailer */
$mailer = $container['mailer'];

在PhpStorm中(按照标准),使用两个星号并在变量名称之前写入数据类型。

可以不带变量名称(但不能写入没有数据类型的名称)的数据类型。


答案 2

虽然您当然可以在每次访问容器时告诉 IDE 从容器中取出的对象的类型,但最好只执行一次。以下两种解决方案都涉及对容器进行子类化。我刚刚开始使用Pimple,无论如何都建议这样做。

对于使用通过 magic 方法访问或通过 magic 方法公开的实例成员的容器,可以告诉 IDE 它们包含的类型。这很好,因为它在运行代码时不涉及任何额外的解析 - 只有IDE被它困扰。->__get

/**
 * My container. It contains things. Duh.
 *
 * @property MyService $service
 * @property MyDao $dao
 */
class MyContainer extends Container { }

对于 Pimple 和其他充当数组的容器,您可以为所需的顶级对象创建访问器函数。虽然这意味着在创建容器时进行更多的解析,但它应该完成一次并保存在APC中。无论如何,我更喜欢使用数组访问的方法,因为它将易于忘记的数组密钥放在自动完成的方法中。

class MyContainer extends Pimple
{
    /**
     * @return MyService
     */
    public function getMyService() {
        return $this['service'];
    }
}

顺便说一句,对于 NetBeans 中的类型提示内联变量,您需要使用一个星号这不是文档块注释,不适用于 或 。此外,名称位于类型之前。@var/*/**//

public function foo() {
    /* @var $service MyService */
    $service = $container['service'];
    ...
}

推荐