Slim Framework中的依赖注入 - 将Container传递给您自己的类

And*_*ndy 5 php slim

我已经对这个帖子做过评论,但似乎已经死了所以我开了一个新的:依赖注入Slim Framework 3

上面的帖子解释了如何将Slims Container传递给您自己编写的课程.

但是,OP已经询问是否可以将Slim转换为Dependency Inject 所有类.

我也有兴趣知道是否有办法做到这一点,因为它似乎只是DRY,如果你必须将容器传递给你想要使用它的每个类.

作为一个例子,如果我想使用Slim的一个函数(比如在我自己的一个类中进行重定向),我不能按照文档使用它:

$res->withStatus(302)->withHeader('Location', 'your-new-uri');
Run Code Online (Sandbox Code Playgroud)

因为$res(响应对象)不在我的类的范围内,除非我注入/传递它.

问题是,如果我说100个课程,我是否必须通过(或注入)容器100次?这看起来真的非常乏味.

在像CakePHP这样的框架中,您可以使用'AppController'来全局执行这样的操作,即定义一次,并使其在所有类中可用.Slim不提供此功能吗?如果没有,这是一个严重的缺点,IMO.


编辑 - 我在其中一条评论中添加此内容,尝试进一步解释问题:

如果您查看First Application Tutorial - http://slimframework.com/docs/tutorial/first-app.html - 他们正在向容器添加PDO数据库连接.

假设我在子目录中有100个单独的类(该示例具有../classes/目录)并使用在index.php中自动加载它们spl_autoload_register().容器不适用于任何类别.

如果我不得不分别传递100次,每次我使用我的一个类,只是为了得到一个PDO连接(这只是一个例子),那么这使代码非常重复,即不是DRY.

Geo*_*nov 10

Slim 默认配有Pimple.一些开发人员认为(并且我倾向于同意这些),Pimple不是依赖注入容器,而是服务定位器,因为它不能自己解决依赖关系,需要注册它们.

Slim 3可以与任何实现Container互操作接口的依赖管理器一起使用,PHP-DI就是这样做的.

去寻找这个包.这就是我用于我的项目,因为自动装配,它简直太棒了.简单地说,PHP-DI读取类的构造函数并理解需要注入的内容,不需要像使用Pimple那样注册依赖项.

有时我认为(希望?)PHP-DI将取代Pimple作为Slim的默认DI容器,因为它更简单.

以下是您对Pimple的处理方式:

<?php
namespace Controllers;

class UsersController
{
    // Inject Container in controller (which is bad, actually)
    public function __construct(ContainerInterface $container)
    {
        // grab instance from container
        $this->repository = $container['userRepository'];
    }

    // Handler of a route
    public function getAllUsers($request, $response)
    {
        $user = $this->repository->getAllUsers();
        return $response->withJson($users);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是与PHP-DI相同的控制器:

<?php
namespace Controllers;

class UsersController
{
    // Declare your dependencies in constructor:
    // PHP-DI will find the classes and inject them automatically
    public function __construct(UserRepository $repository)
    {
        $this->repository = $repository;
    }

    // Handler of a route
    public function getAllUsers($request, $response)
    {
        $user = $this->repository->getAllUsers();
        return $response->withJson($users);
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是,如果我说100个课程,我是否必须通过(或注入)容器100次?这看起来真的非常乏味.

如果您使用与PHP-DI捆绑在一起的Slim,则问题会通过自动装配自动解决.:)

  • 奥黛丽的解决方案完全可以接受; 它在Slim的教程中提供.但是,将容器作为构造函数参数传递实际上会使依赖注入的目的无效并增加可测性复杂性.它似乎更简单. (4认同)
  • Slim关于依赖注入的文档非常令人担忧(有点烦人),并且它发现它并没有真正正确地使用它.这实际上并不是我所知道的并且花了很长时间阅读DI和Slim,只是发现它甚至没有正确使用它 - 非常令人沮丧.我将更详细地介绍自动装配和Slim Bridge,感谢您的建议. (2认同)