Кастомні перетворення в Laravel дозволяють виконувати індивідуальні трансформації даних, виходячи за межі стандартних можливостей, для роботи зі складними типами даних та бізнес-логікою.
Ось приклад форматування номера телефону за допомогою кастомних перетворень:
<?php
namespace App\Casts;
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
use Illuminate\Database\Eloquent\Model;
class PhoneNumber implements CastsAttributes
{
public function get(Model $model, string $key, mixed $value, array $attributes): string
{
return sprintf(
"+%d (%d) %d-%d",
...explode('|', $value)
);
}
public function set(Model $model, string $key, mixed $value, array $attributes): string
{
$value = preg_replace('/[^0-9]/', '', $value);
return implode('|', [
substr($value, 0, 1),
substr($value, 1, 3),
substr($value, 4, 3),
substr($value, 7)
]);
}
}
І ще один приклад форматування адреси:
<?php
namespace App\Casts;
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
use Illuminate\Database\Eloquent\Model;
class Address implements CastsAttributes
{
public function get(Model $model, string $key, mixed $value, array $attributes): array
{
$data = json_decode($value, true);
return [
'street' => $data['street'],
'city' => $data['city'],
'state' => $data['state'],
'postal_code' => $data['postal_code'],
'formatted' => sprintf(
'%s, %s, %s %s',
$data['street'],
$data['city'],
$data['state'],
$data['postal_code']
)
];
}
public function set(Model $model, string $key, mixed $value, array $attributes): string
{
return json_encode([
'street' => $value['street'],
'city' => $value['city'],
'state' => $value['state'],
'postal_code' => $value['postal_code']
]);
}
}
У вашій моделі ви зможете використовувати обидва формати в такій ситуації:
class User extends Model
{
protected $casts = [
'address' => Address::class,
'phone' => PhoneNumber::class
];
}
Кастомні перетворення забезпечують зручний та повторно використовуваний спосіб обробки складних трансформацій даних, залишаючи ваші моделі легкими та зручними для обслуговування.