Controller -> Service -> Repository -> Model
Route::resource('/pizzas', 'PizzaController', ['only' => [ 'index', ]]); Route::group(['prefix' => 'pizzas'], function() { Route::resource('/orders', 'Pizza\OrderController', ['only' => [ 'create', 'store', ]]); });
GET /pizzas
App\Http\Controllers\PizzaController@index
GET /pizzas/orders/create
App\Http\Controllers\Pizza\OrderController@create
POST /pizzas
App\Http\Controllers\Pizza\OrderController@store
public function index(PizzaService $pizzaService) { return view('pizza.index', [ 'pizzas' => $pizzaService->all(), ]); }
<?php namespace App\Services; abstract class BaseService { public $repo; public function all() { return $this->repo->all(); } public function paginated() { return $this->repo->paginated(config('paginate')); } public function create(array $input) { return $this->repo->create($input); } public function find($id) { return $this->repo->find($id); } public function update($id, array $input) { return $this->repo->update($id, $input); } public function destroy($id) { return $this->repo->destroy($id); } }
<?php namespace App\Services; use App\Repositories\PizzaRepository; class PizzaService extends BaseService { private $pizzaRepository; public function __construct(PizzaRepository $pizzaRepository) { $this->pizzaRepository = $pizzaRepository; } }
$pizzaService->all()
list page continuation, $pizzaService->all()
calls the all () method in the BaseRepository, since we do not overwrite it.
<?php namespace App\Repositories; use Illuminate\Database\Eloquent\Model; abstract class BaseRepository { public $sortBy = 'created_at'; public $sortOrder = 'asc'; public function all() { return $this->model ->orderBy($this->sortBy, $this->sortOrder) ->get(); } public function paginated($paginate) { return $this ->model ->orderBy($this->sortBy, $this->sortOrder) ->paginate($paginate); } public function create($input) { $model = $this->model; $model->fill($input); $model->save(); return $model; } public function find($id) { return $this->model->where('id', $id)->first(); } public function destroy($id) { return $this->find($id)->delete(); } public function update($id, array $input) { $model = $this->find($id); $model->fill($input); $model->save(); return $model; } }
<?php namespace App\Repositories; use App\Models\Pizza; class PizzaRepository extends BaseRepository { protected $model; public function __construct(Pizza $pizza) { $this->model = $pizza; } }
<?php namespace App\Repositories; use App\Models\Pizza; class PizzaRepository extends BaseRepository { protected $model; public function __construct(Pizza $pizza) { $this->model = $pizza; } public function create(array $input) { return $this->model->hydrate( DB::select( 'CALL create_pizza(?, ?)', [ $name, $hasCheese, ] ) ); } }
<?php namespace App\Repositories\Traits; trait Sortable { public $sortBy = 'created_at'; public $sortOrder = 'asc'; public function setSortBy($sortBy = 'created_at') { $this->sortBy = $sortBy; } public function setSortOrder($sortOrder = 'desc') { $this->sortOrder = $sortOrder; } }
<?php namespace App\Services; use App\Repositories\PizzaRepository; class PizzaService extends BaseService { private $pizzaRepository; public function __construct(PizzaRepository $pizzaRepository) { $this->pizzaRepository = $pizzaRepository; $this->pizzaRepository->setSortBy('sort_order'); } }
<?php namespace App\Repositories\Traits; trait Relationable { public $relations = []; public function setRelations($relations = null) { $this->relations = $relations; } }
public function all() { return $this->model ->with($this->relations) ->orderBy($this->sortBy, $this->sortOrder) ->get(); }
$this->repo->setRelations(['orders']);
Source: https://habr.com/ru/post/350778/