我正在寻求澄清是否将代码放入控制器,实体或提供服务.
我有’cardset’和’card’对象(其中许多后者嵌入在前者MongoDB中),由普通的PHP类/对象表示.它们包含例如属性’id’,’postal_address’.
我有一种生成卡片PDF的方法.目前我在’Card’对象中有这个,所以从我可以调用的Controller:
$card->makePDF()
这对我来说似乎很干净,但我怀疑我错了.
如果我将所有逻辑放在控制器中,这些逻辑变得冗长而且难以操作,而且我不确定控制器是否可以作用于我的对象的方法.那是什么服务?
试图总结一下:如果一个对象知道它可以“自己”做的所有常规事情,并将它们作为成员函数包含在内,或者其他方法应该传递给对象进行操作.如果是这样,那些方法应该保留在哪里?
我很确定它不是’存储库’,因为它似乎有助于检索/存储实体.
谢谢!
简短回答:
更长的答案:
通常,特别是在Symfony2中,模型应该只用于存储数据.控制器用于操纵模型之间的关系,视图用于以人类或计算机可读的形式表达数据.服务适用于不适合上述任何内容的事情 – 与您的Web应用程序状态无关的事情.
一个很好的例子就是发送电子邮件.电子邮件包含数据(模型).用户已发送电子邮件(控制器).电子邮件看起来有某种方式(视图).但是,实际发送电子邮件的行为与Web应用程序的状态无关(所有服务都知道是否要求将此电子邮件发送给这些人).因此,有一个独立的服务只处理发送电子邮件是有道理的.
同样,生成PDF文件的行为与Web应用程序的状态无关. PDF生成器不需要知道您的应用程序中发生了什么,它只是知道它被要求制作PDF.