我已经对此线程发表了评论,但是它似乎已经死了,因此我打开了一个新线程:Dependency Injection Slim Framework 3

上面的帖子介绍了如何将Slims Container传递给您自己编写的类(class)。

但是,OP询问是否有可能使Slim to Dependency Inject所有它们的类。

我也想知道是否有办法做到这一点,因为如果您必须将容器传递给要使用它的每个类,那么它似乎除了DRY之外什么都没有。

例如,如果我想使用Slim的功能之一(例如在自己的一个类中进行重定向),则无法按照文档使用:

$res->withStatus(302)->withHeader('Location', 'your-new-uri');

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

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

在CakePHP之类的框架中,您可以使用“AppController”在全局范围内执行此类操作,即一次定义内容,并将其在所有类中都可用。 Slim不提供此功能吗?如果不是这样,那将是一个严重的缺点,IMO。

编辑-我将从为进一步解释该问题而做出的评论之一中添加此内容:

如果您查看“第一应用程序教程”(http://slimframework.com/docs/tutorial/first-app.html),他们将向容器添加PDO数据库连接。

假设我在一个子目录中有100个单独的类(示例中有一个../classes/目录),并使用spl_autoload_register()将它们自动加载到index.php中。在所有这些类中,容器都不可用。

如果我必须分别传递100次,那么每次使用我的一个类时,只是为了获得PDO连接(这只是一个示例),那么这会使代码具有很强的重复性,即不是DRY。

最佳答案

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

Slim 3可与实现Container interop interface的任何依赖项管理器一起使用,PHP-DI可以实现此功能。

this package。这就是我在项目中使用的,因为autowiring,这真是太神奇了。简单地说,PHP-DI读取类的构造函数并了解需要注入(inject)的内容,因此不必像使用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);
    }
}

这是与PHP-DI相同的 Controller :
<?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);
    }
}



如果您使用Slim与PHP-DI捆绑在一起,则可以通过 Autowiring 自动解决该问题。 :)

关于php - Slim Framework中的依赖注入(inject)-将容器传递到您自己的类中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40176059/

10-16 07:26