Laravel supports casting backed enums out of the box, but what if you don't want
to use backed enums? This is where CastsBasicEnumerations comes in.
Note: for attribute casting with State see here.
enum yourEnum {
case MY_ENUM;
}
use Illuminate\Database\Eloquent\Model;
use Henzeb\Enumhancer\Laravel\Concerns\CastsBasicEnumerations;
class YourModel extends Model
{
use CastsBasicEnumerations;
$casts = [
'column' => YourEnum::class
];
}
By default, it will use the name of the basic enumeration as the value. If you
want the lowercase variant, you can add the $keepEnumCase property and set it
to false.
class YourModel extends Model
{
use CastsBasicEnumerations;
private $keepEnumCase = false;
$casts = [
'column' => YourEnum::class
];
}
When using State, You want to prevent state changes that aren't
possible. CastsStatefulEnumerations does that. It will throw an
IllegalEnumTransitionException when a transition is not allowed
enum elevator {
use State;
case Open;
case Close;
case Move;
case Stop;
}
use Illuminate\Database\Eloquent\Model;
use Henzeb\Enumhancer\Laravel\Concerns\CastsStatefulEnumerations;
class YourModel extends Model
{
use CastsStatefulEnumerations;
$casts = [
'state' => elevator::class
];
/** Use this when you want to use hooks. */
public function getTransactionHooks(string $attribute) : ?TransitionHooks{
return match($attribute) {
'state' => new YourElevatorHook($this->currentFloor);
}
}
}
$model = new YourModel();
$model->state = elevator::Open; // works
$model->state = elevator::Close; // works
$model->state = elevator::Stop; // IllegalEnumTransitionException
When you cast enums in your model that do not use State, but use the aggegrate
trait Enhancers, you can either use the individual needed traits on that enum,
or you can use the $castsIgnoreEnumState parameter on your Model.
class YourModel extends Model
{
// list of column name(s) you wish to ignore
protected $castsIgnoreEnumState = ['maintenance_mode'];
}
How can I help you explore Laravel packages today?