Налаштування перетворення даних за допомогою Laravel Casts

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 19 грудня, 2024
Використання кастомних конвертерів у Laravel відкриває можливості для гнучкої трансформації даних, забезпечуючи контроль над складними типами даних і бізнес-логікою. Дізнайтеся, як налаштувати формати телефонних номерів та адрес, щоб ваші моделі залишалися чистими та зручними в обслуговуванні

Кастомні перетворення в 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
    ];
}

Кастомні перетворення забезпечують зручний та повторно використовуваний спосіб обробки складних трансформацій даних, залишаючи ваші моделі легкими та зручними для обслуговування.