lumen - Where to place Laravel queries using Repository pattern -


i creating api using lumen , i'm not entirely confident should putting database queries. using repository pattern , layout so:

  1. controller loads custom repository
  2. repository method contains eloquent query , returns result.

controller --> custom repository --> model

controller <-- custom repository <-- model

-- high level code example of how doing it:

controller.php

public function browse() {     // customrepo added via dependency injection     $this->customrepo->browse() } 

customrepo.php

public function browse() {     // other logic here     return member::where('active', 1)->orderby('date', 'desc')->get() } 

i using eloquent make queries database , of these calls happening inside repository feels bit odd me because repositories filling eloquent (and query builder) queries have seen few sources it's not correct put queries inside model.

i feel current approach correct wanted see if definitively tell me best - doesn't make whole lot of sense me pad out models custom methods if not needed.

a few points consider. first, clarifications on terminology. repository pattern you've exemplified not repository pattern. it's more akin data access object pattern. see quentin-starin's answer concise description of differences between two. second, model in mvc architecture more class extends (in case eloquent's) model class. lot's been written brevity's sake, model composite aspect of mvc application deals managing data in addition domain/business logic. use term entity refer specific eloquent-based classes you've created (e.g. - member). given understanding, (for code-reuse/loose-coupling/srp/etc.), can beneficial place queries within model. idea not deal data persistence directly in entities. remaining question being, "how should access model and/or entities?".

one method have seen , used call repository/dao's methods directly controller doing. sake of testability accomplished injecting instance of entity in question repository class. example, within customrepo.php file create similar following:

protected $model;  public function __construct(\app\member $model) {     $this->model = $model; }  public function getactivemembers() {     return $this->model->where('active', 1)->orderby('date', 'desc')->get() } 

another approach create additional layer of abstraction between controller , repository via service layer calls repository/etc. reside. service layer can place fire domain events, wrap multiple data access methods in database transactions, etc. personal approach create new layers of abstraction when recognize need them and/or start violate solid principles. until then, kiss.


Comments