Вы можете использовать конвейеры Laravel для применения каких-либо проверок к вашему заказу.
Представьте себе, что вы можете правильно извлечь конфигурацию ограничений из базы данных и создать массив (или что-то вроде экземпляра ConstraintBag). ), который содержит все ограничения, которые необходимо проверить:
configuration
$constraints = [
DateRangeConstraint::class,
TotalAmountConstraint::class,
AllowedItemsContraint::class,
];
Каждое ограничение может соответствовать одному и тому же интерфейсу (Constraint
в этом Po C), который будет определять единственный метод handle
:
use Closure;
class DateRangeConstraint implements Constraint
{
public function handle($order, Closure $next)
{
if ($order->promo->start_date >= 'date' || $order->promo->end_date <= 'date') {
throw new PromotionConstraintException($this);
}
return $next($order);
}
}
Тогда в вашем методе контроллера / сервиса вы можете использовать этот массив правил в конвейере и передать объект заказа (или объект, который содержит все части, необходимые для проверки всех ограничений), хотя ограничения. Если что-то из этого не получится, вы можете вызвать пользовательское исключение (возможно, одно для каждой категории ограничения / одно для ограничения) и вернуть итоговый результат процесса validation
:
// Do not forget to add the use statement
use Illuminate\Pipeline\Pipeline;
class PromotionValidationService
{
protected $constraints;
// Pass in the constraints array you have already built
public function __construct($constraints)
{
$this->constraints = $constraints;
}
// Start the validation process and cycle through all the constraints
// I would pass in the order object as you might need to access the total
// order amount and/or the items in the order
public function validate($order)
{
try {
app(Pipeline::class)
->send($order)
->through($this->constraints);
} catch (PromotionConstraintException $exception) {
// Handle the exception and return false or rethrow
// the exception for further handling from the caller.
return false;
}
return true;
}
}
Очевидно, что это все еще подтверждение концепций и потребует больше изучения и архитектурного планирования для обработки различных ограничений, которые вам, возможно, потребуется проверить (например, прохождение всего объекта $order
может быть не лучшей идеей, или оно может быть еще недоступно при проверке продвижения ограничения). Однако это может быть гибкой альтернативой фиксированной последовательности if / elses, которую необходимо редактировать для каждого изменения.