【问题标题】:Is there a way to decouple Laravel Eloquent models from Service or Controller level?有没有办法将 Laravel Eloquent 模型与服务或控制器级别分离?
【发布时间】: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 即可获取我需要的所有信息。在不影响控制器和服务的情况下,更改数据存储看起来也更容易。

这种方式有意义吗?

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    我认为您正在寻找的是工厂模式。你已经走在正确的轨道上了。基本上你有一个中间人类,你的控制器或存储库基本上要求为它们提供适当的模型。通过解析条件或使用 .envs 的配置文件,只要它返回的任何内容都实现相同的接口,它就会确定要提供哪个服务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-18
      • 1970-01-01
      • 2018-08-24
      • 1970-01-01
      相关资源
      最近更新 更多