我正在尝试在使用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的关系和功能最好在哪里? 是将所有内容正确放入模型中还是最好将其全部放入存储库中?
答案 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;
}
}