Cast your Eloquent model attributes to value objects with ease!
This package requires PHP >= 5.4. Using the latest version of PHP is highly recommended. Laravel 4.x and 5.x are supported.
Note: Running tests for this package requires PHP >=5.6.
Require this package with composer using the following command:
composer require redcrystal/cast
This package lets you easily cast your model attributes to Value Objects that implement our RedCrystal\Cast\ValueObject
interface. A simple example is provided below.
<?php
namespace App\ValueObjects;
use RedCrystal\Cast\ValueObject;
class Email implements ValueObject
{
protected $value;
public function __construct($value)
{
$this->value = $value;
}
public function toScalar()
{
return $this->value;
}
public function __toString() {
return $this->toScalar();
}
}
Set up your model by using the included Trait
and adding a tiny bit of configuration.
<?php
namespace App;
use App\ValueObjects\Email;
use Illuminate\Database\Eloquent\Model;
use RedCrystal\Cast\CastsValueObjects;
class User extends extends Model {
use CastsValueObjects;
protected $objects = [
// name of the attribute => name of the value object class
'email' => Email::class
];
// ...
}
When accessing attributes of your model normally, any attribute you've set up for casting will be returned as an instance of the Value Object.
$user = User::find($id);
$user->email; // returns instance of App\ValueObjects\Email
$user->email->toScalar(); // "[email protected]"
(string) $user->email; // "[email protected]"
You can set an attribute set up for casting with either a scalar (native) value, or an instance of the Value Object.
$user = new User();
$user->email = "[email protected]";
$user->email = new Email("[email protected]");
This package is open-source software licensed under the MIT license.