我最近从Slim 2.X搬到了Slim 3.X,我发现了一个可能有点愚蠢的问题,但在某些方面让我很烦.
新的Slim 3.X,作为旧的2.X版本之间的差异,它使用依赖注入容器(DIC)构建在Pimple上实现了一个新的容器系统.
正如我一直在阅读的那样,我觉得这是一个非常好的增强功能,因为它可以让你以很多不同的方式管理你的PHP应用程序.
当我开始玩它所拥有的新东西时,我发现了令人困惑的东西,也许是我所缺少的东西.
我用PHPStorm;我喜欢这个IDE的一个原因是它的代码完成以及编写代码和理解类的工具(我实际上是一个学生,所以这对我很有帮助).
当我编写一个Slim路径时,如果我想访问存储在容器中的视图对象,我必须使用$this->视图变量来引用它.问题是,通常情况下,当我提到它时,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是否可以列出容器对象的属性和方法,如下所示:
谢谢!
解决方法:
最简单的方法是使用单独的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;
}
}
为此,您现在需要一个DIC工厂:
$container['ProductsListAction'] = function ($c) {
return new ProductsListAction($c['view']);
};
您现在可以将新操作注册为可调用的路由:
$app->get('/products', 'ProductListAction');
现在,PhpStorm将在您的ProductsListAction类中正确自动完成.