Ada*_*les 7 php model-view-controller symfony
我正在寻求澄清是否将代码放入控制器,实体或提供服务.
我有'cardset'和'card'对象(其中许多后者嵌入在前者MongoDB中),由普通的PHP类/对象表示.这些包含属性,例如'id','postal_address'.
我有一种生成卡片PDF的方法.目前我在'Card'对象中有这个,所以从我可以调用的Controller:
$card->makePDF()
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎很干净,但我怀疑我错了.
如果我将所有逻辑放在控制器中,这些逻辑变得冗长且难以操作,而且我不确定控制器是否可以作用于我的对象的方法.那是什么服务?
试图总结一下:如果一个对象知道它可以做"自己"的所有常规事物并将它们作为成员函数包含在其中,或者其他地方的方法应该通过该对象来进行操作.如果是这样,那些方法应该保留在哪里?
我很确定它不是'存储库',因为它似乎有助于检索/存储实体.
谢谢!
PDF生成应该是服务,而不是对象的方法.
通常,特别是在Symfony2中,模型应该只用于存储数据.控制器用于操纵模型之间的关系,而视图用于以人类或计算机可读的形式表达数据.服务适用于不适合上述任何内容的事情 - 与您的Web应用程序状态无关的事情.
一个很好的例子就是发送电子邮件.电子邮件包含数据(模型).用户已发送电子邮件(控制器).电子邮件看起来有某种方式(查看).但是,实际发送电子邮件的行为与Web应用程序的状态无关(所有服务都知道是否要求将此电子邮件发送给这些人).因此,有一个独立的服务只处理发送电子邮件是有道理的.
同样,生成PDF文件的行为与Web应用程序的状态无关.PDF生成器不需要知道您的应用程序中发生了什么,它只是知道它被要求制作PDF.
Symfony2不是MVC结构(正如Fabien本人所说),正是因为它给出了所有的V(树枝)和C(控制器),但没有给出M部分.M部分是"免费",可以根据需要进行构建.
有一个主要的困惑,人们"认为"主义是模型.但事实并非如此.我们所做的是Bundle中的两个目录,一个叫做Doctrine-ODM类的"Document",另一个叫做"Model",其中包含"业务逻辑".
我个人认为$ card-> makePDF()是有道理的......
但是$ card应该是一个"模型卡",它继承或有一个基础对象"数据卡",这是一个学说类.
您可以使用继承,或使用接口,创建者或任何您想要将"模型卡"与"数据卡"相关联,但关键是"学说不是商业模式"它只是一个持久层和您的模型是"普通类",您可以构建它来包装您的数据并使控制器使用模型,而不是数据.