orbitroom
@orbitroom
Fullstack, laravel, php, js, css. Стаж 10 лет

Как правильно изменить реализацию шаблона репозиторий подгружаемого с помощью интерфейсов для инициализации модели?

Доброго времени суток.

Был создан магазин на основе https://github.com/Laracommerce/laracom на ларавел.
В процессе работы было замечено что наряду с подтягиванием реализации под интерфейс вызовом типа:
use App\Shop\Products\Repositories\Interfaces\ProductRepositoryInterface;

связывание которых объявлено в RepositoryServiceProvider (app\Providers\RepositoryServiceProvider.php),

$this->app->bind(
            ProductRepositoryInterface::class,
            ProductRepository::class
        );

используются прямые вызовы типа
use App\Shop\Products\Repositories\ProductRepository;

(например здесь app/Shop/Orders/Repositories/OrderRepository.php)

В коде можно найти несколько подобных примеров и чаще всего прямое указание адреса необходимо для вызова конструкции new Repository(ОбъектМодели). Например
public function buildOrderDetails(Collection $items)
    {
        $items->each(function ($item) {
            $productRepo = new ProductRepository(new Product);
            $product = $productRepo->find($item->id);
            if ($item->options->has('product_attribute_id')) {
                $this->associateProduct($product, $item->qty, [
                    'product_attribute_id' => $item->options->product_attribute_id
                ]);
            } else {
                $this->associateProduct($product, $item->qty);
            }
        });
    }


Не нашел однозначного выхода из данной ситуации, прошу совета тех кто сталкивался с примером качественной реализации паттерна Репозиторий на laravel.
  • Вопрос задан
  • 170 просмотров
Пригласить эксперта
Ответы на вопрос 1
PQR
@PQR
Чтобы конкретно этот метод buildOrderDetails не вызывал внутри new ProductRepository, код нужно переписать так:

class OrderRepository extends BaseRepository implements OrderRepositoryInterface
{
    use OrderTransformable;

    public function __construct(Order $order, ProductRepositoryInterface $productRepo)
    {
        parent::__construct($order);
        $this->model = $order;
        $this->productRepo = $productRepo;
    }

    public function buildOrderDetails(Collection $items)
    {
        $items->each(function ($item) {
            $product = $this->productRepo->find($item->id);
            if ($item->options->has('product_attribute_id')) {
                $this->associateProduct($product, $item->qty, [
                    'product_attribute_id' => $item->options->product_attribute_id
                ]);
            } else {
                $this->associateProduct($product, $item->qty);
            }
        });
    }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы