Add Calculator Contract,

Add some checking for calculators,
This commit is contained in:
Patrick Henninger
2020-08-29 22:09:38 +02:00
parent 57d73f32b3
commit 43e440c485
5 changed files with 36 additions and 5 deletions

View File

@@ -3,10 +3,11 @@
namespace Gloudemans\Shoppingcart\Calculation; namespace Gloudemans\Shoppingcart\Calculation;
use Gloudemans\Shoppingcart\CartItem; use Gloudemans\Shoppingcart\CartItem;
use Gloudemans\Shoppingcart\Contracts\Calculator;
class DefaultCalculator class DefaultCalculator implements Calculator
{ {
public static function getAttribute(string $attribute, CartItem $cartItem) static function getAttribute(string $attribute, CartItem $cartItem)
{ {
$decimals = config('cart.format.decimals', 2); $decimals = config('cart.format.decimals', 2);

View File

@@ -3,10 +3,11 @@
namespace Gloudemans\Shoppingcart\Calculation; namespace Gloudemans\Shoppingcart\Calculation;
use Gloudemans\Shoppingcart\CartItem; use Gloudemans\Shoppingcart\CartItem;
use Gloudemans\Shoppingcart\Contracts\Calculator;
class GrossPrice class GrossPrice implements Calculator
{ {
public static function getAttribute(string $attribute, CartItem $cartItem) static function getAttribute(string $attribute, CartItem $cartItem)
{ {
$decimals = config('cart.format.decimals', 2); $decimals = config('cart.format.decimals', 2);

View File

@@ -4,9 +4,12 @@ namespace Gloudemans\Shoppingcart;
use Gloudemans\Shoppingcart\Calculation\DefaultCalculator; use Gloudemans\Shoppingcart\Calculation\DefaultCalculator;
use Gloudemans\Shoppingcart\Contracts\Buyable; use Gloudemans\Shoppingcart\Contracts\Buyable;
use Gloudemans\Shoppingcart\Contracts\Calculator;
use Gloudemans\Shoppingcart\Exceptions\InvalidCalculatorException;
use Illuminate\Contracts\Support\Arrayable; use Illuminate\Contracts\Support\Arrayable;
use Illuminate\Contracts\Support\Jsonable; use Illuminate\Contracts\Support\Jsonable;
use Illuminate\Support\Arr; use Illuminate\Support\Arr;
use ReflectionClass;
/** /**
* @property-read mixed discount * @property-read mixed discount
@@ -398,7 +401,14 @@ class CartItem implements Arrayable, Jsonable
return round($this->weight * $this->qty, $decimals); return round($this->weight * $this->qty, $decimals);
} }
return call_user_func(config('cart.calculator', DefaultCalculator::class).'::getAttribute', $attribute, $this); $class = new ReflectionClass(config('cart.calculator', DefaultCalculator::class));
if (!$class->implementsInterface(Calculator::class))
{
throw new InvalidCalculatorException('The configured Calculator seems to be invalid. Calculators have to implement the Calculator Contract.');
}
return call_user_func($class->getName().'::getAttribute', $attribute, $this);
} }
/** /**

View File

@@ -0,0 +1,10 @@
<?php
namespace Gloudemans\Shoppingcart\Contracts;
use Gloudemans\Shoppingcart\CartItem;
interface Calculator
{
static function getAttribute(string $attribute, CartItem $cartItem);
}

View File

@@ -0,0 +1,9 @@
<?php
namespace Gloudemans\Shoppingcart\Exceptions;
use RuntimeException;
class InvalidCalculatorException extends RuntimeException
{
}