gpt4 book ai didi

php - 将持久性添加到 MVC 模型的最佳实践是什么?

转载 作者:可可西里 更新时间:2023-10-31 22:08:28 25 4
gpt4 key购买 nike

我正在用 PHP 实现一个超轻型 MVC 框架。从数据库、文件等加载数据应该独立于模型,这似乎是一个普遍的观点,我同意。我不确定将此“数据层”链接到 MVC 的最佳方式。


数据存储与模型交互

//controller
public function update()
{

$model = $this->loadModel('foo');
$data = $this->loadDataStore('foo', $model);

$data->loadBar(9); //loads data and populates Model
$model->setBar('bar');
$data->save(); //reads data from Model and saves

}

Controller 在模型和数据存储之间进行调解

似乎有点冗长,并且需要模型知道数据存储的存在。

//controller
public function update()
{

$model = $this->loadModel('foo');
$data = $this->loadDataStore('foo');

$model->setDataStore($data);

$model->getDataStore->loadBar(9); //loads data and populates Model
$model->setBar('bar');
$model->getDataStore->save(); //reads data from Model and saves

}

数据存储扩展模型

如果我们想要保存一个将数据库数据存储扩展到平面文件数据存储的模型,会发生什么情况?

//controller
public function update()
{

$model = $this->loadHybrid('foo'); //get_class == Datastore_Database

$model->loadBar(9); //loads data and populates
$model->setBar('bar');
$model->save(); //saves

}

模型扩展数据存储

这允许模型可移植性,但这样扩展似乎是错误的。此外,数据存储不能使用模型的任何方法。

//controller extends model
public function update()
{

$model = $this->loadHybrid('foo'); //get_class == Model

$model->loadBar(9); //loads data and populates
$model->setBar('bar');
$model->save(); //saves

}

编辑:模型与 DAO 通信

//model
public function __construct($dao)
{
$this->dao = $dao;
}

//model
public function setBar($bar)
{
//a bunch of business logic goes here
$this->dao->setBar($bar);
}

//controller
public function update()
{
$model = $this->loadModel('foo');
$model->setBar('baz');
$model->save();
}

非常感谢任何关于“最佳”选项或替代选项的输入。

最佳答案

我认为它不属于 Controller ——它实际上是 View 的一部分,可以来来去去。业务逻辑和持久性不应依赖于 View 或 Controller 。

单独的服务层使您有机会将该逻辑作为分布式组件公开给非基于浏览器的客户端(例如,移动 View 、批处理等)

我不会让模型在面向对象的意义上扩展数据存储,因为继承是一种 IS-A 关系。正如您所指出的,该模型不是关系数据库;这只是持久信息的众多选择之一。

我认为更多的是构图。持久层可以是一个单独的 DAO,它可以持久化模型对象,而不需要它们知道它们的生命周期更长这一事实。或者您有混合行为,其中模型宣传其具有 CRUD 操作的事实,但它只是将请求传递给给定的实现。

通常的 Spring 习惯用法有一个与 Controller 分离的服务层。它知道用例和工作单元。它使用模型和持久性对象来实现用例的目标。

MVC 意味着三个参与者。我会说有比典型应用程序更多的层 - 需要添加持久性和服务。

更新:

如果模型对象没有从持久性包中导入任何东西,那么它就不知道任何东西。这是一个简单的例子,使用一个简单的模型类 Person 及其 DAO 接口(interface),每个都在自己的包中:

package persistence.model;

public class Person
{
private String name;

public Person(String name)
{
this.name = name;
}

public String getName()
{
return name;
}

public void setName(String name)
{
this.name = name;
}
}

请注意,DAO 接口(interface)会导入模型包,但反之则不然:

package persistence.persistence;

import persistence.model.Person;

import java.util.List;

public interface PersonDao
{
Person find(Long id);
List<Person> find();

void saveOrUpdate(Person p);
}

关于php - 将持久性添加到 MVC 模型的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1621360/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com