我的控制器有一个帐户对象和一个用户对象,几乎所有与后端的交互都取决于这些对象来设置访问权限,限制数据加载, (我不是使用任何特定框架(
我的控制器有不同的方式知道要使用哪些对象,但是通常这是在登录用户的会话中(但是后端过程可能会从队列等获得此信息(。
所以,我正在尝试为我的Servicelayer设置PHP-DI,我需要将帐户,用户对象注入服务,但是我该如何以一种很好的方式确保这些值具有正确的值?
我的第一次尝试是将其传递到容器中:
public static function getInstance(EnvironmentConfig $config, ?int $accountId, ?int $userId):Container
然后在配置中动态使用这些值,但是当我启用汇编时,当值被缓存时,这停止了工作。(显而易见但是..(
我可以使用工厂来创建UserObject和帐户对象,例如直接从工厂的会话中读取值。但这感觉非常肮脏,只能在某些情况下起作用。
该文档仅处理特定环境的值,因此我没有找到任何如何处理特定于会话的数据的很好的描述。
任何建议的模式?
容器应存储无状态对象。请求特定的数据(例如会话,登录用户等(不是依赖项,试图将它们放入容器中意味着返回全球状态。
我强烈建议您通过其他方式传递该数据:方法调用参数,将它们存储在请求对象中,更糟地注入RequestStack
或类似对象。这就是Symfony在使用容器直接注入Request
对象时所做的:
感谢您的快速答复。主要我同意,这些东西是边界线,因为它们是所有应用程序层的固有的,因此该应用程序具有全局状态,具体取决于帐户和用户的记录,并且在整个会话中仍然如此。是的,这在技术上是特定要求的,但是我需要服务层意识到这一点,因为很多业务逻辑都取决于它。
方法调用参数在技术上会很干净,但是超音和错误容易容易出现,因为这将是应用程序中重复的相同参数。所有的服务电话都会像这样:
$service->getCategory($id, $user, $account);
$service->getCategoryByMain($mainCategoryId, $user, $account);
因此,我正在寻找PHP-DI以获得更清洁的注入,而不是我当前的设置,在该设置中,我在应用程序中获得了各个方面的服务构造函数。
不确定如何使此整洁,因此请为任何良好的实用建议开放::)也许PHP-DI不是这里的正确工具,但这是DI问题,我有一个需要将其推下来的依赖性堆栈。