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;
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);

View File

@@ -3,10 +3,11 @@
namespace Gloudemans\Shoppingcart\Calculation;
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);

View File

@@ -4,9 +4,12 @@ namespace Gloudemans\Shoppingcart;
use Gloudemans\Shoppingcart\Calculation\DefaultCalculator;
use Gloudemans\Shoppingcart\Contracts\Buyable;
use Gloudemans\Shoppingcart\Contracts\Calculator;
use Gloudemans\Shoppingcart\Exceptions\InvalidCalculatorException;
use Illuminate\Contracts\Support\Arrayable;
use Illuminate\Contracts\Support\Jsonable;
use Illuminate\Support\Arr;
use ReflectionClass;
/**
* @property-read mixed discount
@@ -398,7 +401,14 @@ class CartItem implements Arrayable, Jsonable
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
{
}