Как правильно реализовать взаимодействие с разными типами одной модели
В приложении есть модель Order которая представляет заказы пользователей. В ней помимо прочих есть поле type (тип заказа). Также есть два контроллера, OrderController(отвечает за создание заказов пользователями) и Admin/OrderController(просморт заказов и обработка администрацией). В приложении есть система прав и ролей основаная на middleware(пакет spatie/laravel-permission). Проблема в том что нужно сделать разные права для работы з разными типами заказов, и при использовании одного контроллера сделать это будет непросто, нерационально и т.д. Я пришел к такому варианту, оставить один контроллер для пользователя, а для администратора делать отдельные контроллеры для каждого типа заказа, а модель оставить одну.
Вопрос 2. Также используются репозитории, как вариант, делать отдельные репозитории наследующие клас OrderRepository редактируя только метод startConditions() добавляя where('status', 'STATUSNAME').
Пример кода репозитория:
<?php
namespace App\Repositories;
use App\Models\Order as Model;
use Illuminate\Database\Eloquent\Collection;
/**
* Class OrderRepository.
*/
class OrderRepository extends CoreRepository
{
protected function getModelClass()
{
return Model::class;
}
/**
* Return collection of orders for list with pagination
*
* @param int $count Orders per page
* @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
*/
public function getAllWithPaginate($count = 25)
{
$columns = ['id', 'user_id', 'group', 'type', 'state', 'response_message', 'user_id',];
$result = $this->startConditions()
->select($columns)
->oldest('id')
->with(['user:id,name'])
->paginate($count);
return $result;
}
}
CoreRepository:
<?php
namespace App\Repositories;
use Illuminate\Database\Eloquent\Model;
abstract class CoreRepository
{
/**
* @var Model
*/
protected $model;
/** CoreRepository constructor */
public function __construct()
{
$this->model = app($this->getModelClass());
}
/**
* @return Model
*/
abstract protected function getModelClass();
/**
* @return Model
*/
protected function startConditions()
{
return clone $this->model;
}
}