'DeliveryMethodSelf', DeliveryMethodType::UNKNOWN => 'DeliveryMethodUnknown', ]; /** * Фабричный метод создания объекта метода доставки счета по типу. * * @param string|null $type Тип метода доставки счета * * @return AbstractDeliveryMethod */ public function factory(?string $type): AbstractDeliveryMethod { if (!array_key_exists($type, $this->typeClassMap)) { $type = DeliveryMethodType::UNKNOWN; } $className = __NAMESPACE__ . '\\' . $this->typeClassMap[$type]; return new $className(); } /** * Фабричный метод создания объекта метода доставки счета из массива. * * @param array $data Массив данных метода доставки счета * @param null|string $type Тип метода доставки счета */ public function factoryFromArray(array $data, ?string $type = null): AbstractDeliveryMethod { if (null === $type) { if (array_key_exists('type', $data)) { $type = $data['type']; unset($data['type']); } else { throw new InvalidArgumentException( 'Parameter type not specified in DeliveryMethodFactory.factoryFromArray()' ); } } $paymentData = $this->factory($type); $paymentData->fromArray($data); return $paymentData; } }