Compare commits
No commits in common. "feat/validate-billing-address" and "dev" have entirely different histories.
feat/valid
...
dev
1 changed files with 0 additions and 85 deletions
|
|
@ -16,8 +16,6 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||||
use Illuminate\Database\Eloquent\Relations\HasOne;
|
use Illuminate\Database\Eloquent\Relations\HasOne;
|
||||||
use Illuminate\Database\Eloquent\Relations\MorphTo;
|
use Illuminate\Database\Eloquent\Relations\MorphTo;
|
||||||
use Illuminate\Support\Facades\Validator;
|
|
||||||
use Illuminate\Validation\ValidationException;
|
|
||||||
use Spatie\Activitylog\LogOptions;
|
use Spatie\Activitylog\LogOptions;
|
||||||
use Spatie\Activitylog\Traits\LogsActivity;
|
use Spatie\Activitylog\Traits\LogsActivity;
|
||||||
|
|
||||||
|
|
@ -53,94 +51,11 @@ class Order extends Model
|
||||||
use HasFactory;
|
use HasFactory;
|
||||||
use LogsActivity;
|
use LogsActivity;
|
||||||
|
|
||||||
/**
|
|
||||||
* Required keys for a valid billing address.
|
|
||||||
*
|
|
||||||
* @var array<int, string>
|
|
||||||
*/
|
|
||||||
public const BILLING_ADDRESS_REQUIRED_FIELDS = ['line1', 'city', 'postcode', 'country'];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* All recognised billing address keys.
|
|
||||||
*
|
|
||||||
* @var array<int, string>
|
|
||||||
*/
|
|
||||||
public const BILLING_ADDRESS_ALLOWED_FIELDS = ['line1', 'line2', 'city', 'state', 'postcode', 'country'];
|
|
||||||
|
|
||||||
protected static function newFactory(): OrderFactory
|
protected static function newFactory(): OrderFactory
|
||||||
{
|
{
|
||||||
return OrderFactory::new();
|
return OrderFactory::new();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static function booted(): void
|
|
||||||
{
|
|
||||||
$validate = function (self $order): void {
|
|
||||||
$order->validateBillingAddress();
|
|
||||||
};
|
|
||||||
|
|
||||||
static::creating($validate);
|
|
||||||
static::updating($validate);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Validate the billing_address structure.
|
|
||||||
*
|
|
||||||
* When `commerce.checkout.require_billing_address` is enabled (default),
|
|
||||||
* the billing address must be present and contain the required fields.
|
|
||||||
* When disabled, null is permitted but any non-null value must still
|
|
||||||
* conform to the expected structure.
|
|
||||||
*
|
|
||||||
* @throws ValidationException
|
|
||||||
*/
|
|
||||||
public function validateBillingAddress(): void
|
|
||||||
{
|
|
||||||
$requireAddress = config('commerce.checkout.require_billing_address', true);
|
|
||||||
$address = $this->billing_address;
|
|
||||||
|
|
||||||
// Null is acceptable only when billing address is not required
|
|
||||||
if ($address === null) {
|
|
||||||
if ($requireAddress) {
|
|
||||||
throw ValidationException::withMessages([
|
|
||||||
'billing_address' => ['Billing address is required.'],
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Non-null value must be an array
|
|
||||||
if (! is_array($address)) {
|
|
||||||
throw ValidationException::withMessages([
|
|
||||||
'billing_address' => ['Billing address must be an array.'],
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
$validator = Validator::make($address, [
|
|
||||||
'line1' => ['required', 'string', 'max:255'],
|
|
||||||
'line2' => ['nullable', 'string', 'max:255'],
|
|
||||||
'city' => ['required', 'string', 'max:255'],
|
|
||||||
'state' => ['nullable', 'string', 'max:255'],
|
|
||||||
'postcode' => ['required', 'string', 'max:20'],
|
|
||||||
'country' => ['required', 'string', 'size:2'],
|
|
||||||
]);
|
|
||||||
|
|
||||||
if ($validator->fails()) {
|
|
||||||
throw ValidationException::withMessages(
|
|
||||||
collect($validator->errors()->toArray())
|
|
||||||
->mapWithKeys(fn (array $messages, string $key) => [
|
|
||||||
"billing_address.{$key}" => $messages,
|
|
||||||
])
|
|
||||||
->all()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Strip any unrecognised keys to prevent data pollution
|
|
||||||
$this->billing_address = array_intersect_key(
|
|
||||||
$address,
|
|
||||||
array_flip(self::BILLING_ADDRESS_ALLOWED_FIELDS)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected $fillable = [
|
protected $fillable = [
|
||||||
'orderable_type',
|
'orderable_type',
|
||||||
'orderable_id',
|
'orderable_id',
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue