Skip to content

Commit

Permalink
fix: restructure AbstractCarrier
Browse files Browse the repository at this point in the history
(cherry picked from commit 5fe2456)
  • Loading branch information
EdieLemoine committed Nov 8, 2021
1 parent c3ae428 commit 022e95d
Show file tree
Hide file tree
Showing 14 changed files with 178 additions and 151 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -51,13 +51,13 @@ public function getCarrier(): ?string
*/
public function getCarrierId(): ?int
{
if ($this->carrier === null) {
if (null === $this->carrier) {
return null;
}

$carrier = CarrierFactory::createFromName($this->carrier);

return $carrier::getId();
return $carrier->getId();
}

/**
Expand Down
69 changes: 44 additions & 25 deletions src/Factory/ConsignmentFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,12 @@

namespace MyParcelNL\Sdk\src\Factory;

use BadMethodCallException;
use MyParcelNL\Sdk\src\Model\Carrier\AbstractCarrier;
use MyParcelNL\Sdk\src\Model\Carrier\CarrierBpost;
use MyParcelNL\Sdk\src\Model\Carrier\CarrierDPD;
use MyParcelNL\Sdk\src\Model\Carrier\CarrierFactory;
use MyParcelNL\Sdk\src\Model\Carrier\CarrierPostNL;
use MyParcelNL\Sdk\src\Model\Carrier\CarrierRedJePakketje;
use MyParcelNL\Sdk\src\Model\Consignment\AbstractConsignment;
use MyParcelNL\Sdk\src\Model\Consignment\BpostConsignment;
use MyParcelNL\Sdk\src\Model\Consignment\DPDConsignment;
Expand All @@ -13,45 +18,59 @@

class ConsignmentFactory
{
private const CARRIER_CONSIGNMENT_MAP = [
CarrierBpost::class => BpostConsignment::class,
CarrierDPD::class => DPDConsignment::class,
CarrierPostNL::class => PostNLConsignment::class,
CarrierRedJePakketje::class => RedJePakketjeConsignment::class,
];

/**
* @param int $carrierId
*
* @return \MyParcelNL\Sdk\src\Model\Consignment\AbstractConsignment
* @throws \Exception
*/
public static function createByCarrierId(int $carrierId): AbstractConsignment
{
switch ($carrierId) {
case PostNLConsignment::CARRIER_ID:
return new PostNLConsignment();
case BpostConsignment::CARRIER_ID:
return new BpostConsignment();
case DPDConsignment::CARRIER_ID:
return new DPDConsignment();
case RedJePakketjeConsignment::CARRIER_ID:
return new RedJePakketjeConsignment();
}

throw new BadMethodCallException("Carrier id $carrierId not found");
$carrier = CarrierFactory::createFromId($carrierId);

return self::getConsignmentFromCarrier($carrier);
}

/**
* @param string $carrierName
*
* @return \MyParcelNL\Sdk\src\Model\Consignment\AbstractConsignment
* @throws \Exception
*/
public static function createByCarrierName(string $carrierName): AbstractConsignment
{
switch ($carrierName) {
case PostNLConsignment::CARRIER_NAME:
return new PostNLConsignment();
case BpostConsignment::CARRIER_NAME:
return new BpostConsignment();
case DPDConsignment::CARRIER_NAME:
return new DPDConsignment();
case RedJePakketjeConsignment::CARRIER_NAME:
return new RedJePakketjeConsignment();
}

throw new BadMethodCallException("Carrier name $carrierName not found");
$carrier = CarrierFactory::createFromName($carrierName);

return self::getConsignmentFromCarrier($carrier);
}

/**
* @param \MyParcelNL\Sdk\src\Model\Carrier\AbstractCarrier $carrier
*
* @return \MyParcelNL\Sdk\src\Model\Consignment\AbstractConsignment
*/
public static function createFromCarrier(AbstractCarrier $carrier): AbstractConsignment
{
return self::getConsignmentFromCarrier($carrier);
}

/**
* @param \MyParcelNL\Sdk\src\Model\Carrier\AbstractCarrier $carrier
*
* @return \MyParcelNL\Sdk\src\Model\Consignment\AbstractConsignment
*/
private static function getConsignmentFromCarrier(AbstractCarrier $carrier): AbstractConsignment
{
$carrierClass = get_class($carrier);
$consignmentClass = self::CARRIER_CONSIGNMENT_MAP[$carrierClass];

return new $consignmentClass();
}
}
2 changes: 1 addition & 1 deletion src/Model/Account/CarrierOptions.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public function __construct(array $options)
$this->enabled = (bool) $options['enabled'];
$this->optional = (bool) $options['optional'];
$this->carrier = CarrierFactory::createFromId($options['carrier']['id']);
$this->label = $options['label'] ?? $this->carrier::getHuman();
$this->label = $options['label'] ?? $this->carrier->getHuman();
}

/**
Expand Down
30 changes: 27 additions & 3 deletions src/Model/Carrier/AbstractCarrier.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,44 @@

abstract class AbstractCarrier
{
/**
* @var string
*/
protected $human;

/**
* @var int
*/
protected $id;

/**
* @var string
*/
protected $name;

/**
* The human-readable name of the carrier.
*
* @return string
*/
abstract public static function getHuman(): string;
public function getHuman(): string
{
return $this->human;
}

/**
* @return int
*/
abstract public static function getId(): int;
public function getId(): int
{
return $this->id;
}

/**
* @return string
*/
abstract public static function getName(): string;
public function getName(): string
{
return $this->name;
}
}
28 changes: 12 additions & 16 deletions src/Model/Carrier/CarrierBpost.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,28 +4,24 @@

namespace MyParcelNL\Sdk\src\Model\Carrier;

use MyParcelNL\Sdk\src\Model\Consignment\BpostConsignment;

class CarrierBpost extends AbstractCarrier
{
public static function getHuman(): string
{
return 'bpost';
}
public const HUMAN = 'bpost';
public const ID = 2;
public const NAME = 'bpost';

/**
* @var string
*/
protected $human = self::HUMAN;

/**
* @return int
* @var int
*/
public static function getId(): int
{
return BpostConsignment::CARRIER_ID;
}
protected $id = self::ID;

/**
* @return string
* @var string
*/
public static function getName(): string
{
return BpostConsignment::CARRIER_NAME;
}
protected $name = self::NAME;
}
27 changes: 10 additions & 17 deletions src/Model/Carrier/CarrierDPD.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,31 +4,24 @@

namespace MyParcelNL\Sdk\src\Model\Carrier;

use MyParcelNL\Sdk\src\Model\Consignment\DPDConsignment;

class CarrierDPD extends AbstractCarrier
{
public const HUMAN = 'DPD';
public const ID = 4;
public const NAME = 'dpd';

/**
* @return string
* @var string
*/
public static function getHuman(): string
{
return 'DPD';
}
protected $human = self::HUMAN;

/**
* @return int
* @var int
*/
public static function getId(): int
{
return DPDConsignment::CARRIER_ID;
}
protected $id = self::ID;

/**
* @return string
* @var string
*/
public static function getName(): string
{
return DPDConsignment::CARRIER_NAME;
}
protected $name = self::NAME;
}
35 changes: 20 additions & 15 deletions src/Model/Carrier/CarrierFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,22 @@ class CarrierFactory
CarrierRedJePakketje::class,
];

/**
* @param int $carrierId
*
* @return bool
*/
public static function canCreateFromId(int $carrierId): bool
{
foreach (self::CARRIER_CLASSES as $carrierClass) {
if ($carrierId === $carrierClass::ID) {
return true;
}
}

return false;
}

/**
* @param string|int $carrierNameOrId
*
Expand All @@ -35,12 +51,12 @@ public static function create($carrierNameOrId): AbstractCarrier
}

/**
* @param string $carrierClass
* @param string|\MyParcelNL\Sdk\src\Model\Carrier\AbstractCarrier $carrierClass
*
* @return \MyParcelNL\Sdk\src\Model\Carrier\AbstractCarrier
* @throws \Exception
*/
public static function createFromClass(string $carrierClass): AbstractCarrier
public static function createFromClass($carrierClass): AbstractCarrier
{
return Classes::instantiateClass($carrierClass, AbstractCarrier::class);
}
Expand All @@ -54,25 +70,14 @@ public static function createFromClass(string $carrierClass): AbstractCarrier
public static function createFromId(int $carrierId): AbstractCarrier
{
foreach (self::CARRIER_CLASSES as $carrierClass) {
if ($carrierId === $carrierClass::getId()) {
if ($carrierId === $carrierClass::ID) {
return new $carrierClass();
}
}

throw new Exception('No carrier found for id ' . $carrierId);
}

public static function canCreateFromId(int $carrierId): bool
{
foreach (self::CARRIER_CLASSES as $carrierClass) {
if ($carrierId === $carrierClass::getId()) {
return true;
}
}

return false;
}

/**
* @param string $carrierName
*
Expand All @@ -82,7 +87,7 @@ public static function canCreateFromId(int $carrierId): bool
public static function createFromName(string $carrierName): AbstractCarrier
{
foreach (self::CARRIER_CLASSES as $carrierClass) {
if ($carrierName === $carrierClass::getName()) {
if ($carrierName === $carrierClass::NAME) {
return new $carrierClass();
}
}
Expand Down
27 changes: 10 additions & 17 deletions src/Model/Carrier/CarrierPostNL.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,31 +4,24 @@

namespace MyParcelNL\Sdk\src\Model\Carrier;

use MyParcelNL\Sdk\src\Model\Consignment\PostNLConsignment;

class CarrierPostNL extends AbstractCarrier
{
public const HUMAN = 'PostNL';
public const ID = 1;
public const NAME = 'postnl';

/**
* @return string
* @var string
*/
public static function getHuman(): string
{
return 'PostNL';
}
protected $human = self::HUMAN;

/**
* @return int
* @var int
*/
public static function getId(): int
{
return PostNLConsignment::CARRIER_ID;
}
protected $id = self::ID;

/**
* @return string
* @var string
*/
public static function getName(): string
{
return PostNLConsignment::CARRIER_NAME;
}
protected $name = self::NAME;
}
Loading

0 comments on commit 022e95d

Please sign in to comment.