将 ORM 模型和 MVC 的搜索逻辑放在哪里? [复制]
Posted
技术标签:
【中文标题】将 ORM 模型和 MVC 的搜索逻辑放在哪里? [复制]【英文标题】:Where to put search logic with ORM models and MVC? [duplicate] 【发布时间】:2013-07-27 09:13:36 【问题描述】:我对 ORM 很陌生,对 MVC 有点经验,所以我想知道以下几点:
我有 ORM 模型 User
、Organization
.. 当我想搜索 organization 1
中的所有用户时,我执行以下操作:
$users = Model_User::query()->where('organisation_id', 1);
应该直接把它放在控制器中,还是放在其他地方?
【问题讨论】:
好吧,这取决于你的模型是否需要(能够)一直知道(模型)?还是在特定页面(Controller)中显示特定信息?或者甚至作为每个页面上的小部件(我仍然会选择控制器),HMVC 会更好地用于这样的小部件。 在这种情况下,它被用作页面的输出,但由于我已经使用 CodeIgniter 有一段时间了,我会在模型中创建一个输出对象数组的函数。 我会选择控制器。这不是一个复杂的查询,所以如果您在其他任何地方都需要它,有什么损失? (相关) ***.com/questions/3109715/… 【参考方案1】:理想情况下,您应该在 ORM(或数据层或持久性或存储库)和控制器之间有另一层。您可以调用此服务/AppServices/BLL。
这一层应该处理额外的逻辑,而您的 ORM 应该直接从数据库/其他来源获取数据作为映射,并且控制器应该根据用户请求调用下一层。
ORM:
Users GetUsers() //for all users
服务:
Users GetUsersForOrganization(int orgId) //call orm method and filter for organization id
【讨论】:
不幸的是,这些框架没有模型层。只有活动记录的集合,他们喜欢假装是“模型”。【参考方案2】:当我使用 MVC 时,我总是有一个值对象 Data1 和一个映射器 Data1Mapper。 ValueObject 本身用于保存数据,映射器包含以下方法:find、save、delete、fetchAll 等......
在控制器中,我实例化映射器并访问所需的方法。
例子:
class DataMapper
public function __construct()
//fetch TableDateGateway
public function find()
//find by identifier
public function save($data)
//insert or update
class Data
protected $_property;
public function getProperty()
return $this->_property;
public function setProperty($value)
$this->_property = $value;
class Controller
public function indexAction()
$id = 1;
$mapper = new DataMapper();
$data = $mapper->find($id); //--> returns if found a Data-Object
【讨论】:
-1:那不是数据映射器,您的“控制器”已经与上述DataMapper
类紧密耦合,并且映射器不存储/检索值对象。
@tereško 这与 Zend Framework 1.x 中的做法完全相同。所以他们不使用有效的 MVC?控制器只将数据传递给模型。这有什么问题?
@TobiasKun erm,ZF1 根本没有 DataMappers 或 ORM。他们有返回记录集的 TableDataGateways。它们不返回值对象,也不返回实体。
@Gordon:在快速入门中,他们将映射器添加为与 TableDataGateway 交互并将返回的记录集转换为 VO 的抽象层。
啊,可能是这样。我已经很久没有看过快速入门了。当我第一次拿起 ZF 时,它肯定不在那里。但即使它不是 VO(在 DDD 和 POEAA 意义上),并且在控制器和映射器之间有一个额外的服务层肯定有助于将业务逻辑排除在控制器之外,控制器是表示层的一部分,应该可以在没有重写任何查询。当然,如果您知道其中的含义,您可以出于实用的原因省略该服务层。以上是关于将 ORM 模型和 MVC 的搜索逻辑放在哪里? [复制]的主要内容,如果未能解决你的问题,请参考以下文章