@kopcapuk

Как правильно создать класс в laravel-data?

Для создания заказа есть такой класс данных:
class OrderData extends Data
{
    public function __construct(
        #[Min(2)]
        public string                 $fio,
        #[Rule(['phone:ru'])]
        public string                 $phone,
        #[DateFormat('Y-m-d')]
        public string                 $date,
        #[DateFormat('H:i')]
        public string                 $time_from,
        #[DateFormat('H:i')]
        public string                 $time_to,
        #[Min(5)]
        public string                 $address,
        public OrderCommunicationEnum $communication,
        //... etc
    )
    {
    }
}


Внедряю его в контроллер, чтобы создать заказ:
class OrderController extends Controller
{
    public function store(OrderData $data): void
    {
        Order::query()->create($data->toArray());
    }
}


Всё хорошо, но в заказе ещё есть товары, которые я передаю в формате массива [ID товара => количество].

Как можно создать класс ProductData, чтобы внедрить его в OrderData как зависимость, по аналогии с $fio, OrderCommunicationEnum и прочими параметрами?

Сейчас пока сделал так:
class OrderController extends Controller
{
    public function store(OrderData $data, Request $request): void
    {
        $order = Order::query()->create($data->toArray());

        $order->products()->sync($request->input('products'));
    }
}
  • Вопрос задан
  • 256 просмотров
Пригласить эксперта
Ответы на вопрос 3
Adamos
@Adamos
Ответ написан
Комментировать
@kopcapuk Автор вопроса
Это да, я добавил:
class OrderData extends Data
{
    public function __construct(
        /** @var ProductData[] */
        public array $products,
    )
    {
    }
}

class ProductData extends Data
{
    public function __construct(public Product $product, public int $quantity)
    {
    }
}


Но при сабмите получаю ошибки валидации:
"errors": {
    "products.4": "The products.4 field must be an array.",
    "products.511": "The products.511 field must be an array."
}
Ответ написан
Комментировать
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
#[DataCollectionOf(ProductData::class)]
public array $products
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы