Как изменить использование репозитория шаблонов, загруженного с использованием интерфейсов для инициализации модели? Laravel, Laracom - PullRequest
1 голос
/ 17 января 2020

Добрый день.

Был создан магазин на основе https://github.com/Laracommerce/laracom на Laravel.

В процессе работы это было заметил, что наряду с подтягиванием реализации интерфейса с вызовом вроде:

use App \ Products \ Repositories \ Interfaces \ ProductRepositoryInterface;

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

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

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

Вы можете найти несколько похожих примеров в коде и чаще всего требуется прямой адрес для вызова $ repositoryWithModel = new Repository ($ modelObject).

Я не нашел определенного выхода из этой ситуации, прошу совета те, кто сталкивался с примером качественной реализации.

1 Ответ

0 голосов
/ 17 января 2020

Реализация вашего ProductRepository ожидает Product в качестве параметра конструктора. Репозиторий не должен этого делать. Вместо этого, если хранилище должно обрабатывать модель продукта, оно должно быть передано в качестве параметра функции.

Например, это:

    /**
     * @param Brand $brand
     */
    public function saveBrand(Brand $brand)
    {
        $this->model->brand()->associate($brand);
    }

Может быть переписано в:

    /**
     * @param Product $product
     * @param Brand $brand
     */
    public function saveBrand(Product $product, Brand $brand)
    {
        $product->brand()->associate($brand);
    }

Если вы удалите параметр Product из конструктора, то вы можете использовать хранилище, не создавая его каждый раз, используя ключевое слово new:

class BrandController extends Controller {

   public function __construct(ProductRepositoryInterface $repository) {
       $this->repository = $repository;
   }

   public function linkBrandToProduct(Request $request): void {
      $product = $this->repository->findProductById($request->productId);
      $brand = $this->repository->findBrandById($request->brandId);

      $this->repository->saveBrand($product, $brand);
   }
}
...