Skip to content

Automatically cast JSON columns to PHP objects in Laravel

License

Notifications You must be signed in to change notification settings

tailflow/castable-dto

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

18 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Laravel Castable Data Transfer Object

Deprecated

Please consider using tailflow/dto instead.

Latest Version on Packagist Build Status on GitHub Actions

Have you ever wanted to cast your JSON columns to a value object?

This package gives you an extended version of Spatie's DataTransferObject class, called CastableDataTransferObject.

Under the hood it implements Laravel's Castable interface with a Laravel custom cast that handles serializing between the DataTransferObject (or a compatible array) and your JSON database column.

Installation

You can install the package via composer:

composer require tailflow/castable-dto

Usage

1. Create your CastableDataTransferObject

Check out the readme for Spatie's data transfer object package to find out more about what their DataTransferObject class can do.

namespace App\DataTansferObjects;

use Tailflow\DataTransferObjects\CastableDataTransferObject;

class Address extends CastableDataTransferObject
{
    public string $country;
    public string $city;
    public string $street;
}

2. Configure your Eloquent attribute to cast to it:

Note that this should be a jsonb or json column in your database schema.

namespace App\Models;

use App\DataTansferObjects\Address;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    protected $casts = [
        'address' => Address::class,
    ];
}

And that's it! You can now pass either an instance of your Address class, or even just an array with a compatible structure. It will automatically be cast between your class and JSON for storage and the data will be validated on the way in and out.

$user = User::create([
    // ...
    'address' => [
        'country' => 'Japan',
        'city' => 'Tokyo',
        'street' => '4-2-8 Shiba-koen',
    ],
]);

$residents = User::where('address->city', 'Tokyo')->get();

But the best part is that you can decorate your class with domain-specific methods to turn it into a powerful value object.

$user->address->toMapUrl();

$user->address->getCoordinates();

$user->address->getPostageCost($sender);

$user->address->calculateDistance($otherUser->address);

echo (string) $user->address;

Credits

License

The MIT License (MIT). Please see License File for more information.

About

Automatically cast JSON columns to PHP objects in Laravel

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages