PHPStorm 和 Slim 3.X DIC

PHPStorm and Slim 3.X DIC

我最近从 Slim 2.X 转到 Slim 3.X,我发现了一个可能有点愚蠢但在某些方面让我烦恼的问题。
新的 Slim 3.X,作为与旧 2.X 版本的区别,它使用基于 Pimple.

的依赖注入容器 (DIC) 实现了一个新的容器系统

正如我一直在阅读的那样,我发现这是一个非常重要的改进,因为它可以让您以多种不同的方式管理您的 PHP 应用程序。
当我开始玩弄它的新东西时,我发现了一些令人困惑的东西,这可能是我遗漏的东西。

我用的是PHP风暴;我喜欢这个 IDE 的一件事是它的代码完成以及编写代码和理解的便利 类(我实际上是一名学生,所以这对我有很大帮助)。
当我写一个 Slim 路由时,如果我想访问,例如,我存储在容器中的视图对象,我必须用 $this->view 变量来引用它。问题是,通常,当我提到它时,PHPStorm 会列出对象内部的方法和属性,但 $this 对象不会发生这种情况。

我想,在路由内部,Slim 将所有路由功能和所有容器对象存储到 $this 分配器中。

$container = $app->getContainer();
$container['view'] = new \Slim\Views\PhpRenderer('protected/views/');

$app->get('/products', function(Request $request, Response $response) {
    $response = $this->view->render($response, 'products.php');
    return $response;
})->setName('products');

当我访问我的 /products 路线时,它成功地呈现了我的产品模板并显示了预期显示的内容,所以没有问题。
问题是我想让 PHPStorm 知道路由中的 $this 变量存储了调用路由之前设置的所有容器。

我考虑过 /* @var *//* @global */ 或类似的东西,但在搜索了一段时间并尝试了不同的东西之后,我还没有找到任何可行的方法。

总而言之,我想说的是 PHPStorm 是否可以像这样列出容器对象的属性和方法:

但是在路由中有 $this 对象:

谢谢!

最简单的方法是使用单独的 Action classes 而不是使用闭包。这也有更容易测试的好处。

首先创建您的操作,将其依赖项注入其构造函数并编写一个将由 Slim 调用的 `__invoke`` 方法:

class ProductsListAction {
    protected $view;

    public function __construct(\Slim\Views\PhpRenderer $view) {
        $this->view = $view;
    }

    public function __invoke($request, $response, $args) {
        $response = $this->view->render($response, 'products.php');
        return $response;
    }
}

为此,您现在需要一个 DIC 工厂:

$container['ProductsListAction'] = function ($c) {
    return new ProductsListAction($c['view']);
};

您现在可以将新操作注册为可调用路由:

$app->get('/products', 'ProductListAction');

现在,PhpStorm 将在您的 ProductsListAction class.

中正确地自动完成

我试图为 Eclipse 找到类似的东西,有人建议您使用 Slim\App 的 PHPDOCS 修改属性。因为我不想自己更改 Slim 文件,所以我尝试创建一个扩展 Slim\App 的空 class,并使用 PHPDOCS 为其添加属性:

/**
 * OurApp
 *
 * Extends Slim\App with properties so we have code completion for a bunch of stuff!
 *
 * @property-read SomeClass $something
 * @property-read SomeotherClass $someOtherThing
 * @property-read string $someString
 * @property-read \Slim\Views\PhpRenderer $renderer
 */
class OurApp extends \Slim\App {}
$app = new OurApp($settings);

这很好用。通过这种方式,您可以开始键入 $app-> 并完成标准 Slim\App 中的任何内容,并获得 somethingsomeOtherThingsomeString 等。对于我们项目我们改成了$container中的一堆值 我们需要访问的项目 Dependency.php。