在Laravel中与存储库模式建立了雄辩的关系

时间:2018-07-26 13:15:35

标签: php laravel repository-pattern

我正在尝试在使用Laravel 5.6构建的应用程序中学习和实现存储库模式。

我已经实现了我的控制器:

class CompaniesController extends Controller
{
    protected $company;
    public function __construct(ICompanyRepository $company) {
        $this->company = $company;
    }
    public function index(){
       $companies = $this->company->getAllCompanies();
       return view('companies::index')->with("companies", $companies);
    }
}

然后我实现了存储库接口:

interface ICompanyRepository
{
    public function getAllCompanies();
    public function findBy($att, $columns);
    public function getById($id);
    public function with($relations);
}

我已经实现了我的存储库:

class CompaniesRepository implements ICompanyRepository
{
    protected $model;
    public function __construct(Companies $model){
        $this->model = $model;
    }


    public function getAllCompanies(){
        return $this->model->all();
    }
    public function findBy($att, $columns)
    {
        return $this->model->where($att, $columns);
    }

    public function getById($id)
    {
        return $this->model->findOrFail($id);
    }


    public function with($relations)
    {
        return $this->model->with($relations);

    }
}

然后我创建了模型:

class Companies extends Model
{
    protected $fillable = [];

    protected $casts = [
        'settings' => 'array'
    ];
    //my question is here!
    public function members(){
        return $this->hasMany('Companies\Entities\CompaniesMembers');
    }
}    

现在我已经将关系(在这种情况下为成员函数)放入模型中,但是通过这种方式,如果必须更改ORM,则应该同时更改存储库和模型,因为现在我使用Eloquent,但是我不知道将来是否会使用Doctrine或其他。

所以我的问题是:

与db的关系和功能最好在哪里? 是将所有内容正确放入模型中还是最好将其全部放入存储库中?

1 个答案:

答案 0 :(得分:0)

因此,在EloquentRepo中,您创建了一个函数,该函数通过foreach将公司与公司成员合并,并使用modelToObject($model)这样的功能。希望这对您有帮助。

EloquentRepo:

private function modelToObject($model)
{
    if (is_null($model)) {
        $entity = null;
    } else {
        $entity = new Product(
            $model->{Model::COL_ID},
            $model->{Model::COL_NAME}
        );
    }

    return $entity;
}

实体:

class Product{

    private $id;
    private $name;

    public function __construct(int $id, string $name) {
        $this->setId($id)
             ->setName($name);
    }

    public function setName(string $name): Product{
        $this->name = $name;

        return $this;
    }

    public function getName(): string {
        return $this->name;
    }
}