@GennadyGA
...что-нибудь автоматизировать...

Как подключить/реализовать 4 класса служб доставки?

Всем привет! Отсутствует, от слова совсем, представление как реализовать, но есть самописный PHP сайт, к нему будет подключаться одна или несколько служб доставки.
Мол из БД конфигурация какие службы должны подключаться/работать, а реализация подключает тот или иной класс( возможно метод).
Мой, возможно, будущий велосипед: в if и подкидывать методы, но это как то так себе от того же слова совсем.
Подключать интерфейсы классов, тож нужен свитч или еще неизвестно какое колесо.
Просьба хоть не в реализации, но хотя б ссылку/направление где копать.
... тот момент когда не хватает опыта в архитектуре...
Спасибо!
  • Вопрос задан
  • 219 просмотров
Решения вопроса 1
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
interface DeliveryInterface 
{
    public const TYPE_COURIER = 1;
    public const TYPE_PICKUP_POINT = 2;
    public const TYPE_ALL = self::TYPE_COURIER  + self::TYPE_PICKUP_POINT;

     public function getId(): int;
     public function getName(): string;
     public function getType(): int;
     public function getPaymentTypes(): array;
     public function isAllowedAddress(Address $address): bool;
     public function calculateCost(Address $from, Address $to): array;
}
interface PickupDeliveryInterface extends  DeliveryInterface
{
       public function getPickupPoints(Address $address = null): array;
}
class DeliveryManager
{
      private $deliveries = [];
      public function registerDelivery(DeliveryInterface $delivery)
      {
            $this->deliveries[$delivery->getId()] = $delivery;
      }
      public function registerDeliveryClass(int $id, string $className, array $config = [])
      {
            $this->deliveries[$id] = [$className, ['id' => $id] + $config];
      }
      public function getDelivery(int $id): DeliveryInterface 
      {
            if (!isset($this->deliveries[$id])) {
                throw new InvalidArgumentException();
            }
            if (is_array($this->deliveries[$id])) {
                  [$className, $config] = $this->deliveries[$id];
                  $this->deliveries[$id] = new $className($config);
            }
            return $this->deliveries[$id];
      }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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