Trying to cast $address_val to Address object:
class AlbumData extends Data
{
public string $title;
#[WithCast(AddressCast::class)]
public ?Address $address_val;
}
try {
AlbumData::validateAndCreate([
'title' => 'Never Gonna Give You Up',
'address_val' => 'Never Gonna Give You Up',
]);
} catch (ValidationException $exception) {
dump($exception->validator->errors()->all());
dd($exception->getMessage());
}
Error message:
> "The address_val field must be an array."
class Address extends Data
{
public function __construct(
public ?string $text,
) {}
}
class AddressCast implements Cast
{
public function cast(DataProperty $property, mixed $value, array $properties, CreationContext $context): Address
{
return new Address($value);
}
}
What am I doing wrong?
Notes:
- If you use the
from
method instead ofvalidateAndCreate
, then there is no error and everything works properly. - If Address NOT extends Data, aslo works properly.
Trying to cast $address_val to Address object:
class AlbumData extends Data
{
public string $title;
#[WithCast(AddressCast::class)]
public ?Address $address_val;
}
try {
AlbumData::validateAndCreate([
'title' => 'Never Gonna Give You Up',
'address_val' => 'Never Gonna Give You Up',
]);
} catch (ValidationException $exception) {
dump($exception->validator->errors()->all());
dd($exception->getMessage());
}
Error message:
> "The address_val field must be an array."
class Address extends Data
{
public function __construct(
public ?string $text,
) {}
}
class AddressCast implements Cast
{
public function cast(DataProperty $property, mixed $value, array $properties, CreationContext $context): Address
{
return new Address($value);
}
}
What am I doing wrong?
Notes:
- If you use the
from
method instead ofvalidateAndCreate
, then there is no error and everything works properly. - If Address NOT extends Data, aslo works properly.
1 Answer
Reset to default 0class AlbumData extends Data
{
public string $title;
#[WithCast(AddressCast::class)]
public ?Address $address_val;
}
try {
AlbumData::validateAndCreate([
'title' => 'Never Gonna Give You Up',
'address_val' => 'Never Gonna Give You Up', <-- HERE
]);
} catch (ValidationException $exception) {
dump($exception->validator->errors()->all());
dd($exception->getMessage());
}
Data class from()
method doesn't perform validation and validateAndCreate()
expects array like this:
AlbumData::validateAndCreate([
'title' => 'Never Gonna Give You Up',
'address_val' => ['text' => Never Gonna Give You Up'], <-- FIX
]);
Other depends on your business logic, wether to keep your class extended or not