PHPStorm和Slim 3.X DIC

per*_*aum 3 php slim phpstorm

我最近从Slim 2.X搬到了Slim 3.X,我发现了一个可能有点愚蠢的问题,但在某些方面让我很烦.
新的Slim 3.X,作为旧的2.X版本之间的差异,它实现了一个使用依赖注入容器(DIC)构建在Pimple上的新容器系统.

正如我一直在阅读的那样,我觉得这是一个非常好的增强功能,因为它可以让你以很多不同的方式管理你的PHP应用程序.
当我开始玩它所拥有的新东西时,我发现了令人困惑的东西,这可能是我所缺少的.

我用PHPStorm; 我喜欢这个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');
Run Code Online (Sandbox Code Playgroud)

当我访问我的/products路线时,它成功呈现我的产品模板并显示它预期显示的内容,因此没有问题.
问题在于我希望PHPStorm知道$this路由中的变量,它存储了在调用路由之前先前设置的所有容器.

我想过/* @var *//* @global */或这样的事情,但搜索了一会儿,尝试不同的事情后,我没有发现任何可能的工作.

总之,我想说的是PHPStorm是否可以列出容器对象的属性和方法,如下所示: PHPStorm对象的自动完成功能

但是$this路径中的对象: 此对象中缺少自动完成功能

谢谢!

Rob*_*len 5

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

首先创建你的动作,将它的依赖注入到它的构造函数中,并编写一个将由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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

$container['ProductsListAction'] = function ($c) {
    return new ProductsListAction($c['view']);
};
Run Code Online (Sandbox Code Playgroud)

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

$app->get('/products', 'ProductListAction');
Run Code Online (Sandbox Code Playgroud)

现在,PhpStorm将在您的ProductsListAction班级中正确自动完成.