PHP применяет код из нескольких классов, которые реализуют один и тот же интерфейс - PullRequest
0 голосов
/ 25 октября 2018

В настоящее время я реализую проект, и у меня есть вопрос относительно нескольких классов, реализующих один и тот же интерфейс.

Итак, сейчас у меня есть несколько типов скидок, которые могут быть применены к Заказу.Итак, я создал DiscountInterface, который имеет метод check (), который проверяет, применима ли скидка, и метод apply (), который применяет скидку.

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

В моем контроллере я внедряю DiscountInterface.Когда заказ получен, я вызываю методы check () и apply (), и все работает отлично.

Мой вопрос заключается в следующем.Я для реализации второго типа скидок.После моей реализации мне нужно будет создать новый класс, который реализует DiscountInterface.Но когда пришло время вызвать его на контроллере, как это должно быть сделано.Поскольку у меня разные классы с одинаковыми методами.

Следующий код работает, если у меня есть один класс, реализующий эти методы, но что произойдет, если у меня есть два класса, реализующих их?

public function discount(
    Request $request, 
    DiscountInterface $discount, 
    CustomerRepository $customer, 
    ProductRepository $product, 
    ValidatorInterface $validator,
    OrderServiceInterface $orderService
)
{
    $data = json_decode($request->getContent(), true);
    $order = $orderService->convertDataToOrder($data, $customer, $product, $validator);

    if($discount->check($order, $customer)){
        $order = $discount->apply($order);
    }

1 Ответ

0 голосов
/ 25 октября 2018

Если вам нужно проверить все типы скидок вместо того, чтобы передавать класс реализации, почему бы не передать вместо него DiscountFactory?

<?php

use My\Discount\CrapDiscount;
use My\Discount\AwesomeDiscount;

class DiscountFactory
{
    /** @var DiscountInterface[] */
    private $discounts;

    public function __construct()
    {
        $this->discounts = [
            new CrapDiscount(),
            new AwesomeDiscount(),
        ];
    }

    public function getDiscounts(): array
    {
        return $this->discounts;
    }
}

Тогда ваш код может выглядеть примерно так:

public function discount(
    Request $request, 
    DiscountFactory $discountFactory, 
    CustomerRepository $customer, 
    ProductRepository $product, 
    ValidatorInterface $validator,
    OrderServiceInterface $orderService
)
{
    $data = json_decode($request->getContent(), true);
    $order = $orderService->convertDataToOrder($data, $customer, $product, $validator);

    foreach ($discountFactory->getDiscounts() as $discount) {
        if($discount->check($order, $customer)){
            $order = $discount->apply($order);
        }
    }
    // etc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...