Обеспечение применения приведения до вызова конструктора данных Laravel.Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Обеспечение применения приведения до вызова конструктора данных Laravel.

Сообщение Anonymous »

Я пытаюсь использовать пакет laravel-data от Spatie, чтобы обеспечить типизированный контракт между различными уровнями моего приложения. К сожалению, у меня возникли проблемы с преобразованием строк в Enum, который, согласно документации, должен быть доступен из коробки...

Это возможно создать объект данных из модели... ...Модель может иметь приведения, эти приведения будут вызываться до создания объекта данных.

Ссылка на документацию
Однако, похоже, что это не так, как в руководстве, потому что единственный способ преобразовать мою модель в объект данных, когда модель содержит перечисление, - это для доступа к свойству до создания экземпляра объекта данных.
Вот Enum, (красноречивый) класс модели и класс данных (отдельные файлы)

Код: Выделить всё

enum CarType: string
{
case Sedan = "Sedan";
case SUV = "SUV";
...
}
class Car extends Model
{
protected function casts(): array
{
return ['type' => CarType::class];
}
}
class CarData extends Data
{
public function __construct(
public CarType $type,
...
) {}
}
Когда я пытаюсь преобразовать объект модели (полученный из базы данных) непосредственно в объект данных, я получаю

app\Data\CarData::__construct(): аргумент №1 ($type) должен иметь тип app\Enums\CarType, указана строка, вызываемая в /var/www/vendor/spatie/laravel-data/src/Resolvers /DataFromArrayResolver.php в строке 95

Однако, если я получу доступ к атрибуту типа в модели, а затем попытаюсь, а затем попытаюсь создать DataObject, это работает так, как ожидалось. Пример:

Код: Выделить всё

$car = Car::find(1);
var_dump($car->type); // Errors without this line
$car_data = CarData::from($car);
var_dump($car_data);
Другой способ заставить это работать без искусственного доступа к свойству type — собрать весь код в один файл.
Я вижу здесь несколько возможностей:
  • Я неправильно читаю документацию.
  • В laravel-е есть ошибка. пакет данных
  • Есть опция конфигурации, которую я могу использовать, чтобы гарантировать, что приведения выполняются сразу после создания модели, чтобы она была в хорошем состоянии для создания объекта данных.
Я думаю, что последний сценарий является наиболее вероятным. Может ли кто-нибудь дать здесь какой-либо совет?

Подробнее здесь: https://stackoverflow.com/questions/787 ... -is-called
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»