ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

依赖注入和序列化类

2019-12-01 23:33:13  阅读:223  来源: 互联网

标签:dependency-injection php


我将直接进入.我有一个类User,需要执行一些数据库操作(使用类DB).控制器将根据需要创建数据库,并将其与其构造函数一起注入到User中.

用户登录后,用户对象将存储到会话中.问题在于DB无法序列化到会话,因此当用户唤醒时,其db成员为null,这很糟糕.我用

public function __wakeup() { $this->db = new DB; }

..但是,这绝对是对DI的违反,如果DB需要根据控制器而有所不同(毕竟,控制器会创建它需要的DB),则甚至可能导致一系列问题.

问题在于,当用户从会话中取消序列化时,不会再次构造它,因此它没有机会获得数据库成员.我有几种可能的解决方案,每个问题都有:

>允许通过setter注入设置数据库

>这似乎也不是一个很好的解决方案.这也提供了在不适当的时间设置数据库的可能性,并且似乎仍然违反了DI精神.控制器还必须知道设置数据库

>不要序列化对象,而是每次序列化令牌并重新创建对象

>这将带来不便,而且效率低下.这也可能导致重复(每个控制器将需要执行类似$usr = new User($_ SESSION [‘user-token’],new DB);的操作).另一方面,将User对象保留在超全局变量之外会阻止某些讨厌的全局变量使用.

有什么建议么?

解决方法:

由于您的用户对象具有数据库对象的依赖关系,并且该数据库对象无法序列化,因此您的用户对象本身也无法序列化.

因此,基本上,您的问题是序列化了不可序列化的对象.

您真正需要的是会话状态.创建一个能够选择模型(设置)并能够提供模型(获取)的会话状态对象.

通过将逻辑添加到会话对象中,可以如何序列化特定对象(或者更好的方法是:将其存储在会话中,例如,您通常只需要在数据库模型中存储ID)就可以像其他工厂一样工作.

然后注入Session对象作为依赖项.

标签:dependency-injection,php
来源: https://codeday.me/bug/20191201/2084095.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有