Laravel: ORM независимый репозиторий - PullRequest
0 голосов
/ 02 ноября 2018

Я наткнулся на разные статьи о реализации шаблона репозитория в Laravel, и все они приводят меня в замешательство. Каждый из них ставит свой вес на «сохраняя его независимым от ORM» , но на самом деле никто не показывает пример кода.

Я здесь со своей структурой образца репозитория, которая, я считаю, не является независимой от ORM. Но мне нужно это с решением REAL REPOSITORY PATTERN , где я могу изменить модель ORM с Eloquent на что-то другое, например Doctrine . И держите Бизнес-логику отдельно, так что мне не нужно ее менять. в настоящее время моя бизнес-логика лежит в репозитории (я думаю, что это не рекомендуется)

Основные вопросы:

  1. Мой репозиторий использует имя метода Eloquent внутри него, которого не будет, если я изменю ORM. $this->model = $shops;
  2. В шаблонах Controllers и Blade мы играем с Collections из Eloquent Model. Как мы должны обращаться с ними, если мы изменим ORM?
  3. Куда поместить методы создания / удаления, если они отсутствуют в репозитории.

Пожалуйста, не просто используйте 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'));
    }


}

1 Ответ

0 голосов
/ 02 ноября 2018

Сначала создайте базовый репозиторий. затем расширить этот репозиторий. Попробуйте так. Это может помочь вам

interface BaseRepository{    
    public function getall();
    public function create($data);
    public function update($id, $data);
    public function delete($id);
}


class BaseEloquent implements BaseRepository{
    protected $model;

    public function getall(){
        return $this->model->get();
    }

    ....
    ....

}


interface ShopsRepository extends BaseRepository{

}

class ShopsEloquent extends BaseEloquent implements ShopsRepository{

    public function __construct(Shops $shops){
            $this->model = $shops;
    }

    public function getall(){
        return $this->model::with('shopadmin')->get();
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...