【发布时间】:2020-03-15 15:46:14
【问题描述】:
下面有一个简单的 Laravel Eloquent 模型:
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
}
通常使用存储库模式来处理模型,例如:
use Product;
class ProductRepository implement ProductRepositoryInterface
{
public function __construct(Product $model)
{
$this->model = $model;
}
public function findById($id)
{
return $this->model->find($id);
}
...
}
控制器使用存储库获取Prodcut数据:
class ProductController extends Controller
{
private $productRepository;
public function __construct(ProductRepository $productRepository)
{
$this->productRepository = $productRepository;
}
public function getSomeInfoOfProduct($id)
{
$product = $this->productRepository->findById($id);
return [
'name' => $product->name,
'alias' => $product->alias,
'amount' => $product->amount,
];
}
}
在getSomeInfoOfProduct方法中,当我决定应该返回什么样的信息时,我不知道$product对象有多少属性,直到我查看表products的架构或迁移文件。
看起来控制器与 Eloquent 模型和数据库紧密耦合。如果有一天,我将产品的原始数据存储在 Redis 或其他地方,我仍然需要创建一个 Eloquent 模型对象,并将 Redis 中的数据填充到该对象中。
所以我正在考虑创建一个纯数据对象来替换 Eloquent Model 对象,如下所示:
class ProductDataObject
{
private $name;
private $alias;
private $amount;
private $anyOtherElse;
public function getName() {
return $this->name;
}
....
}
并让存储库返回这个对象:
use Product;
use ProductDataObject;
class ProductRepository implement ProductRepositoryInterface
{
public function __construct(Product $model)
{
$this->model = $model;
}
public function findById($id)
{
$result = $this->model->find($id);
// use some way to fill properties of the object
return new ProductDataObject(...);
}
...
}
在控制器或服务级别,我只需查看ProductDataObject 即可获取我需要的所有信息。在不影响控制器和服务的情况下,更改数据存储看起来也更容易。
这种方式有意义吗?
【问题讨论】: