gpt4 book ai didi

php - Slim Framework 中的依赖注入(inject)——将 Container 传递到你自己的类中

转载 作者:可可西里 更新时间:2023-11-01 13:39:51 26 4
gpt4 key购买 nike

我已经评论过这个话题,但它似乎已经死了所以我打开一个新的:Dependency Injection Slim Framework 3

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

但是,OP 询问是否有可能让 Slim 依赖注入(inject) ALL 他们的类。

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

举个例子,如果我想使用 Slim 的一个功能(比如做一个重定向,在我自己的类中)我不能按照文档使用它:

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

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

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

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


编辑 - 我从我发表的评论之一中添加此内容以尝试进一步解释该问题:

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

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

如果我必须分别传递一些东西 100 次,每次我使用我的一个类,只是为了获得 PDO 连接(这只是一个例子),那么这会使代码非常重复,即不干。

最佳答案

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

Slim 3 与任何实现了 Container interop interface 的依赖管理器一起工作, PHP-DI 做的。

寻找this package .这就是我在我的项目中使用的,它简直太棒了,因为 autowiring .简而言之,PHP-DI 读取类的构造函数并了解需要注入(inject)的内容,所以您不必像使用 Pimple 那样注册依赖项。

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

以下是你如何处理疙瘩:

<?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);
}
}

The problem with this is, if I have say 100 classes, do I have to pass (or inject) the container 100 times? That seems really, really tedious.

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com