tailflow / castable-dto
Automatically cast JSON columns to PHP objects in Laravel using Spatie's data-transfer-object class
Installs: 27 144
Dependents: 0
Suggesters: 0
Security: 0
Stars: 8
Watchers: 2
Forks: 2
Open Issues: 0
Requires
- php: >=8.0
- ext-json: *
- illuminate/contracts: >=8.0
- spatie/data-transfer-object: >=3.0
Requires (Dev)
- orchestra/testbench: 6.0
- phpunit/phpunit: >=8.0
README
Deprecated
Please consider using tailflow/dto instead.
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
- Original package by Jess Archer
License
The MIT License (MIT). Please see License File for more information.