Symfony 什么属于实体类,什么不属于实体类,为什么不属于实体类,以及如何解决实体类?
假设我想使用Symfony 什么属于实体类,什么不属于实体类,为什么不属于实体类,以及如何解决实体类?,symfony,design-patterns,doctrine-orm,doctrine,Symfony,Design Patterns,Doctrine Orm,Doctrine,假设我想使用 $this->generateUrl(“SomeRouting_name”)//这将返回类似于myApp/myCommentpage.html的内容 在一个实体中。为什么我不应该这样做 在实体类中可以使用哪种类型的辅助函数?除了像 public function getId(){ return $this->id; } 很多时候,在控制器中,我发现我的功能看起来很相似,我讨厌这样。例如: class MyController extends Controller{ pu
$this->generateUrl(“SomeRouting_name”)//这将返回类似于myApp/myCommentpage.html的内容
在一个实体中。为什么我不应该这样做
在实体类中可以使用哪种类型的辅助函数?除了像
public function getId(){
return $this->id;
}
很多时候,在控制器中,我发现我的功能看起来很相似,我讨厌这样。例如:
class MyController extends Controller{
public function postCommentAction($cgid = null , $pid = null){
$em = $this->getDoctrine()->getManager();
$cg = $em->getRepository('MyBundle:CommentGroup')->findOneBy(array("id" => $cgid));
$cgp = $em->getRepository('MyBundle:CommentGroupPerson')->findBy(array("comment_group_id" => $cgid, "person_id" => $pid));
if ($cg === null) //redirect...
if ($cgp === null) //redirect
//rest left out since not important
}
例如,我想知道这个CommentGroupPerson是否可以发表评论。
假设该用户是系统管理员或版主,或者其id为7(为什么不可以)。如果用户不满足这些要求,我想重定向到一个错误页面errorwebpc.html.twig
,并显示消息“您将不会通过”
我不喜欢把所有这些业务逻辑都放在控制器上。由于可以有不同的控制器,这将违反dry原则会有什么干净的溶液?
最好也是这样,同时减少行数。如果我们用其他东西替换这里的东西,需要更多的行来写,那么优势就失去了
进一步考虑到:
我们还有一个使用相同实体、不同错误检查的移动应用程序,返回的页面应该是errormobile.html.twig
,错误消息为“对不起,亲爱的用户,您不能通过”使用存储库进行业务逻辑
另外,在实体类中,您是否真的编写了所有getter和setter?您可能会得到很长的代码
我的解决方案:
/**
* Constructor for the class.
*
*/
public function __construct()
{
// Initialise your variables, for example you can generate the UID, or the date
//$this->createdAt = new \DateTime();
}
/**
* Get value for data '$name'
* @param string $name
* @return Type of data '$name'
*/
public function __get($name)
{
return $this->$name;
}
/**
* Set value for data '$name'
* @param string $name
* @param generic $value
* @return Type of data '$name'
*/
public function __set($name, $value)
{
$this->$name = $value;
return $this;
}
public function offsetGet($name)
{
return $this->$name;
}
条令实体应该是普通的旧php对象,并且应该只包含数据和getter/setter。因此,您可能不应该在它们内部实现您的业务逻辑(尽管您可能可以)。你的例子有什么问题
$this->generateUrl("SomeRouting_name");
也就是说,您需要将必要的对象注入实体或从控制器传递它们。没有人阻止您这样做,但是您的实体将与调用代码紧密耦合。(我不确定是否可以使用Symfony的Dependency InAction将某些内容注入实体)
“正确”的解决方案(或至少其中一个)是使用服务。如果你在谷歌上搜索“在symfony中放置业务逻辑的位置”,大多数回答都是关于服务的使用。您可以创建任意数量的服务并注入所需的一切(实体管理器、路由服务等)。使用这种方法,可以减少控制器中重复的代码,并将所有规则和逻辑都包含在服务中
看
除此之外,Symfony和Doctrine还提供了创建侦听器和订阅者的可能性,这可能适用于某些场景
请参见和您的解决方案是存储库类吗?我用ideKinda生成getter和setter,因为Symfony2本身不是一个MVC框架,因为它实际上并不严格尊重设计模式的模型部分,所以我在存储库中创建所有复杂查询,并创建用作模型的服务。关于ide生成的内容,如果您在体系结构中做了一些重大更改,那么维护起来可能会非常麻烦;因此,我还要做的是删除所有生成的getter和setter,以便将这些神奇的函数放在我所有的项目中都运行得非常好。