PHPStorm和Slim 3.X DIC

PHPStorm和Slim 3.X DIC,php,phpstorm,slim,Php,Phpstorm,Slim,我最近从Slim 2.X升级到Slim 3.X,我发现了一个可能有点愚蠢但在某些方面让我恼火的问题。 新的Slim 3.X版本与旧的2.X版本不同,它使用依赖注入容器(DIC)实现了一个新的容器系统 正如我所读到的,我发现这是一个非常好的增强,因为它允许您以多种不同的方式管理PHP应用程序。 当我开始玩弄它所拥有的新事物时,我发现了一些令人困惑的东西,也许是我所缺少的东西 我使用PHPStorm;我喜欢这个IDE的一个方面是它的代码完整性,以及编写代码和理解类的便利性(我实际上是个学生,所以这对

我最近从Slim 2.X升级到Slim 3.X,我发现了一个可能有点愚蠢但在某些方面让我恼火的问题。
新的Slim 3.X版本与旧的2.X版本不同,它使用依赖注入容器(DIC)实现了一个新的容器系统

正如我所读到的,我发现这是一个非常好的增强,因为它允许您以多种不同的方式管理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');
当我访问我的
/products
路线时,它成功地呈现了我的产品模板,并显示了预期显示的内容,因此没有问题。
问题是我想让PHPStorm知道
$this
变量在一个路由中,它存储在调用路由之前设置的所有容器

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

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

但是在路由中使用
$this
对象:


谢谢

最简单的方法是使用单独的操作类,而不是使用闭包。这还具有易于测试的优点

首先创建您的操作,将其依赖项注入其构造函数,并编写一个将由Slim调用的`\u 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将在您的
ProductsStaction
类中正确地自动完成。

我正试图为Eclipse找到类似的内容,有人建议您使用Slim\App的PHPDOCS修改属性。由于我不想自己更改Slim文件,我尝试创建一个扩展Slim\App的空类,并使用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中的任何内容,并获取
某物
某物
某物字符串
,等等。对于我们的项目,我们在
$container
中更改了一组值
我们需要访问的items Dependency.php。

Nice!!所以这看起来是一种更有效的方式来做我想做的事。。。我将尝试在我的项目中实现这种结构。谢谢