【问题标题】:PHPStorm and Slim 3.X DICPHPStorm 和 Slim 3.X DIC
【发布时间】:2020-05-10 01:44:30
【问题描述】:

我最近从 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');

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

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

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

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

谢谢!

【问题讨论】:

    标签: php phpstorm slim


    【解决方案1】:

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

    首先创建你的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 类中正确地自动完成。

    【讨论】:

    • 很好!!所以这看起来像是一种更有效的方式来做我想做的事情......我将尝试在我的项目中实现该结构。谢谢!!
    【解决方案2】:

    我试图为 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 中的任何内容的完成,并获得 somethingsomeOtherThingsomeString 等。对于我们的项目,我们更改为一堆值$container 我们需要访问的项目 Dependency.php。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-02
      • 1970-01-01
      • 2021-03-15
      • 2016-05-17
      • 1970-01-01
      • 1970-01-01
      • 2016-07-23
      • 2020-12-30
      相关资源
      最近更新 更多