Ниже приведена простая 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
, чтобы получить всю необходимую мне информацию. Кроме того, выглядит проще изменить хранилище данных, не затрагивая контроллеры и сервисы.
Имеет ли этот способ смысл?