如何在Doctrine的模型中访问Symfony的当前用户会话?
要做的两种方式(我知道)要么从模型中的sfContext中提取它:
sfContext::getInstance()->getUser()->getCanSwim();
或者,将sfUser实例(或片段)从控制器直接传递给模型:
UserTable::goSwimming($sf_user->can_swim);
但是,这些方法中的任何一种方法都比其他方法更好,还是这不是正确的方法呢?
答案 0 :(得分:5)
答案 1 :(得分:4)
对于这种情况,您应该考虑使用Dependency Injection design pattern作为Fabien Potencier clearly explains。
这个想法是你必须注入到你的依赖对象的所有依赖项中,例如 - 在你的情况下 - 用户或上下文。
那个(第二个选项)将是MVC杀戮的方式,afaic。
答案 2 :(得分:2)
依赖注入是一种特殊的上下文,但我认为有时它是一种过度杀伤。
为什么要实现一个额外的方法,或覆盖一个构造函数,如果你的例子中唯一需要知道当前用户是否可以游泳?
所以,IMMO,如果用例很简单,你可以很好地选择你提供的第二个选项,并将依赖关系降低到它所依赖的值:
goSwimming($sf_user->can_swim);
当然,这一切都取决于所使用的实际概念以及一个类如何从另一个类延伸的扩展。
如果只是这种情况(结果取决于用户游泳的能力),那么可以简化。但是如果被调用的方法/类最终可以使用更多的属性,那么最好使用已经讨论过的依赖注入技术。 UserTable可能依赖于sfUser来处理其他事情,所以这感觉就像一个完整的类依赖。