Я наткнулся на разные статьи о реализации шаблона репозитория в Laravel, и все они приводят меня в замешательство. Каждый из них ставит свой вес на «сохраняя его независимым от ORM» , но на самом деле никто не показывает пример кода.
Я здесь со своей структурой образца репозитория, которая, я считаю, не является независимой от ORM. Но мне нужно это с решением REAL REPOSITORY PATTERN , где я могу изменить модель ORM с Eloquent
на что-то другое, например Doctrine . И держите Бизнес-логику отдельно, так что мне не нужно ее менять. в настоящее время моя бизнес-логика лежит в репозитории (я думаю, что это не рекомендуется)
Основные вопросы:
- Мой репозиторий использует имя метода Eloquent внутри него, которого не будет, если я изменю ORM.
$this->model = $shops;
- В шаблонах Controllers и Blade мы играем с
Collections
из Eloquent Model
. Как мы должны обращаться с ними, если мы изменим ORM?
- Куда поместить методы создания / удаления, если они отсутствуют в репозитории.
Пожалуйста, не просто используйте Domain Object
слово, потому что я устал от
понять это без закодированного примера. Это будет высоко
приветствуется, если вы пытаетесь объяснить [объект домена] с использованием реального кода
Пример, изменив это. [Как вернуть его в контроллер и использовать
в клинке]
Интерфейс:
<?php
namespace Modules\ShopOwner\Entities\Repository\Contract;
interface ShopsRepository {
public function getall();
public function create($data);
public function update($id, $data);
public function delete($id);
}
Красноречивый:
<?php
namespace Modules\ShopOwner\Entities\Repository\Eloquent;
use Illuminate\Database\Eloquent\Model;
use Modules\ShopOwner\Entities\Repository\Contract\ShopsRepository;
use Modules\ShopOwner\Entities\Shops;
class ShopsEloquent implements ShopsRepository
{
protected $model;
public function __construct(Shops $shops)
{
$this->model = $shops;
}
public function getall()
{
return $this->model::with('shopadmin')->get();
}
public function create($data)
{
$this->model::create($data);
}
public function update($id, $data)
{
$this->model::findOrFail($id)->update($data);
}
public function delete($id)
{
$this->model::findOrFail($id)->delete();
}
}
Контроллер:
<?php
namespace Modules\ShopOwner\Http\Controllers;
use App\Http\Controllers\Controller;
use Auth;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Modules\ShopOwner\Entities\Repository\Contract\ShopsRepository;
use Modules\ShopOwner\Entities\Shops;
use Validator;
class ShopsController extends Controller
{
protected $shops;
public function __construct(ShopsRepository $shops)
{
$this->shops = $shops;
}
public function index()
{
$shops = $this->shops->getall();
return view('shopowner::shops.list', compact('shops'));
}
public function store(Request $request)
{
$data = $request->all();
$this->shops->create($data);
return redirect()->route('SO.shops.index')->with('success', __('shopowner::shops.create_success'));
}
public function update(Request $request, $id)
{
$data = $request->all();
$this->shops->update($id, $data);
return redirect()->route('SO.shops.index')->with('success', __('shopowner::shops.update_success'));
}
public function delete($id)
{
$this->shops->delete($id);
return redirect()->route('SO.shops.index')->with('success', __('shopowner::shops.remove_success'));
}
}