Есть ли способ отделить Laravel Eloquent моделей от уровня обслуживания или контроллера? - PullRequest
0 голосов
/ 15 марта 2020

Ниже приведена простая Laravel Eloquent Model:

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{

}

, и для работы с моделью можно использовать шаблон репозитория, например:

use Product;

class ProductRepository implement ProductRepositoryInterface
{
    public function __construct(Product $model) 
    {
        $this->model = $model;
    }

    public function findById($id)
    {
        return $this->model->find($id);
    }

    ...

}

Контроллер использует хранилище для получения Prodcut данных:


class ProductController extends Controller
{
   private $productRepository;

   public function __construct(ProductRepository $productRepository)
   {
       $this->productRepository = $productRepository;
   }

   public function getSomeInfoOfProduct($id)
   {
       $product = $this->productRepository->findById($id);

       return [
            'name' => $product->name,
            'alias' => $product->alias,
            'amount' => $product->amount,
       ];
   }
}

В методе getSomeInfoOfProduct, когда я решаю, какую информацию я должен вернуть, я не знаю, сколько свойств $product объект, пока я не посмотрю на схему таблицы products или файлов миграции.

Похоже, что контроллер тесно связан с моделями Eloquent и базой данных. Если однажды я сохраню необработанные данные продуктов в Redis или других местах, мне все равно нужно создать объект модели Eloquent и заполнить объект данными из Redis.

Так что я собираюсь создать чистый объект данных для замены объекта Eloquent Model, как показано ниже:

class ProductDataObject
{
    private $name;
    private $alias;
    private $amount;
    private $anyOtherElse;

    public function getName() {
        return $this->name;
    }

    ....
}

и пусть репозиторий возвращает этот объект:


use Product;
use ProductDataObject;

class ProductRepository implement ProductRepositoryInterface
{
    public function __construct(Product $model) 
    {
        $this->model = $model;
    }

    public function findById($id)
    {
        $result = $this->model->find($id);

        // use some way to fill properties of the object
        return new ProductDataObject(...);
    }

    ...

}

На уровне контроллера или сервиса я могу просто посмотрите на ProductDataObject, чтобы получить всю необходимую мне информацию. Кроме того, выглядит проще изменить хранилище данных, не затрагивая контроллеры и сервисы.

Имеет ли этот способ смысл?

1 Ответ

0 голосов
/ 15 марта 2020

Я думаю, что вы ищете, это фабричный шаблон. Вы уже на правильном пути. По сути, у вас есть класс-посредник, который ваш контроллер или репозиторий в основном просит предоставить им с соответствующей моделью. Через условия синтаксического анализа или файл конфигурации с использованием .envs он выясняет, какой из них следует обслуживать, при условии, что все, что он возвращает, реализует один и тот же интерфейс.

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