0

我的控制器有一个帐户对象和一个用户对象,几乎所有与后端的交互都依赖于这些对象来设置访问权限、限制数据加载、++++(我没有使用任何特定的框架)

我的控制器有不同的方式知道要使用哪些对象,但通常这是在登录用户的会话中(但后端进程可能会从队列等中获取此信息)。

所以,我正在尝试为我的 ServiceLayer 设置 PHP-DI,我需要将 Account、User 对象注入到服务中,但是我该如何以一种好的方式来确保它们具有正确的值呢?

我的第一次尝试是将其传递给 ContainerFactory:

public static function getInstance(EnvironmentConfig $config, ?int $accountId, ?int $userId):Container

然后在配置中动态使用这些值,但是当我启用编译时,由于值被缓存,这停止了工作。(很明显但是是的..)

我可以使用工厂来创建 userObject 和 Account 对象,例如直接从工厂中的会话中读取值。但这感觉很脏,并且只在某些情况下有效。

该文档仅处理特定于环境的值,因此我没有找到有关如何处理特定于会话的数据的任何好的描述。

有什么建议的模式吗?

4

2 回答 2

2

容器应该存储无状态对象。会话、登录用户等特定于请求的数据不是依赖项,试图将它们放入容器中意味着回到全局状态。

我强烈建议您通过其他方式传递该数据:方法调用参数,将它们存储在 Request 对象中,更糟糕的是注入一个RequestStack或类似的对象。这就是 Symfony 在不推荐Request使用容器直接注入对象时所做的事情:https ://symfony.com/blog/new-in-symfony-2-4-the-request-stack

于 2018-04-01T10:12:22.400 回答
0

感谢您的快速回复。原则上我同意,这些东西是边界线,因为它们是所有应用程序层所固有的,应用程序具有取决于登录帐户和用户的全局状态,并且在整个会话中保持不变。是的,这在技术上是特定于请求的,但我需要服务层意识到这一点,因为很多业务逻辑都依赖于它。

方法调用参数在技术上是干净的,但超级混乱且容易出错,因为这将是在应用程序中重复的相同参数。所有的服务调用都会像这样结束:

$service->getCategory($id, $user, $account);
$service->getCategoryByMain($mainCategoryId, $user, $account);

因此,我正在寻找 PHP-DI 以获得比我当前的设置更干净的注入,在当前设置中,我得到了在应用程序中相同的长服务构造函数。

不知道如何使这个整洁,所以打开任何好的实用建议:) 也许 PHP-DI 不是正确的工具,但这是 DI 问题,我有一组依赖项需要在堆栈中下推。

于 2018-04-01T17:33:49.210 回答