По умолчанию в MoonShine поля работают на основе примитивных типов и ничего не знают о моделях. Сделано это, чтобы система не была привязана только к моделям, а поля могли в зависимости от ситуации иметь доступ и к сырым данным и приведенным к типу
TypeCast для моделей уже есть в коробке MoonShine, но если вам необходимо работать с другим типом данных, то потребуется объект реализующий интерфейс MoonShineDataCast
namespace MoonShine\Contracts; interface MoonShineDataCast{ public function getClass(): string; public function hydrate(array $data): mixed; public function dehydrate(mixed $data): array;}
Давайте взглянем на пример TypeCast для моделей
namespace MoonShine\TypeCasts; use Illuminate\Database\Eloquent\Model;use MoonShine\Contracts\MoonShineDataCast; final class ModelCast implements MoonShineDataCast{ public function __construct( protected string $class ) { } public function getClass(): string { return $this->class; } public function hydrate(array $data): mixed { return (new ($this->getClass())($data)); } public function dehydrate(mixed $data): array { return $data->attributesToArray(); }}
Ну и его применение в FormBuilder/TableBuilder
use MoonShine\TypeCasts\ModelCast; TableBuilder::make(items: User::paginate()) ->fields([ Text::make('Email'), ]) ->cast(ModelCast::make(User::class))
use MoonShine\TypeCasts\ModelCast; FormBuilder::make() ->fields([ Text::make('Email'), ]) ->fillCast(User::query()->first(), ModelCast::make(User::class))