在Laravel中使用工厂模式

时间:2018-08-10 07:56:48

标签: laravel design-patterns repository factory

我正在研究Laravel项目,并希望在我的项目中实现Factory和Repository模式。但是,我仍然不知道应该在哪里使用Factory模式?仍然很混乱。我知道没有必要对每个项目都使用Factory模式,但是作为研究的一部分,我想了解更多有关这两种模式的组合的信息。这是我的代码示例。希望我能得到你们的帮助和解释。谢谢。

class ProductFactory 
{
    public function create()
    {
       return new Product; 
    }
}




class ProductRepository implements ProductRepositoryInterface
{
   protected $productFactory; 

   public function __contruct(
      ProductFactory $productFactory
   )
   {
      $this->productFactory = $productFactory      
   }
   public function all()
   {
      return Product::all();
   }
   public function loadById($id);
   {
      return Product::find($id);
   }
   public function save($data,$id=NULL)
   {
       if($id != NULL){
         $product = $this->loadById($id)
       }
       else{
         $product = $this->productFactory->create(); 
       }
       return $product->fill($data)->save();
   }
   .....
} 

1 个答案:

答案 0 :(得分:0)

我认为您需要拆分工厂和存储库。例如:

R=2

但是对于存储库中的DI来说不是必需的,您的方法(如all(),find()等)都放在AbstractRepository中。您的产品信息库:

class ProductRepository implements ProductRepositoryInterface
{
    protected $product; 

    public function __contruct(Product $product)
    {
        $this->product = $product;
    }
    //...
}

如果要编写测试,可以使用laravel容器: AppServiceProvider:

    class ProductRepository extends AbstractRepository implements ProductRepositoryInterface
    {
        public function __contruct()
        {
           //model property in AbstractRepository
            $this->model = new Product();
        }
    }

ProductRepository:

$this->app->bind(Product::class, function ($app) {
    return new Product();
});

PS:我认为工厂没有用,在大多数情况下,我使用容器。但是在某些困难的情况下,我使用工厂,例如:

$this->model = app()->make(Product::class);