Я возвращаюсь к Laravel через несколько лет и пытаюсь понять, как работает уже существующий REST API, закодированный в Laravel. Я не могу понять, как работает конкретный метод контроллера с несколькими параметрами запроса формы (или работает ли он на самом деле).
REST API был написан в Laravel 5.1. Я просмотрел официальную документацию (как 5.1, так и последнюю) и попытался найти в Интернете и SO связанные темы (например, «запросы на несколько форм контроллера laravel», «запросы на несколько подсказок контроллера laravel» и т. д.) , но я не могу найти четкого объяснения. Может быть, я смотрю на это под неправильным углом.
public function store(ProductRequest $productRequest, PromoRequest $promoRequest)
{
// Validate product
$product = new Product($productRequest->all());
// Validate promo
if ($promoRequest->get('promo')) {
$promo = new Promo($promoRequest->get('promo'));
}
...
}
В большей части документации контроллер принимает только один объект запроса. Я действительно видел несколько примеров с несколькими параметрами запроса формы, но часто им рекомендовалось использовать только один запрос формы. Но помимо передовой практики, как работает этот код? Когда вызывается этот метод, как Laravel узнает, как разделить запрос на два отдельных класса запроса формы?
Пожалуйста, не стесняйтесь, дайте мне знать, если и как я могу объяснить свой вопрос более четко.






The Laravel service container is a powerful tool for managing class dependencies and performing dependency injection. Dependency injection is a fancy phrase that essentially means this: class dependencies are "injected" into the class via the constructor or, in some cases, "setter" methods.
Подробнее об этом можно прочитать здесь: https://laravel.com/docs/5.8/контейнер
Обновлено: Дополнительный вопрос:Тем не менее, я не могу понять, как HTTP-запрос (который всего один) может быть разделен на два разных класса запросов?
HTTP-запрос не разделяется; он просто отправляется через оба класса.
Бывший:
function example(Request $request) {
$productRequest = new ProductRequest($request);
$promoRequest = new PromoRequest($request);
}
Было бы то же самое.
Спасибо за ссылку, я просмотрел ее и теперь лучше понимаю, как работает внедрение зависимостей. Тем не менее, я не могу понять, как HTTP-запрос (который только один) можно разделить на 2 разных класса запросов? Имеет ли этот вопрос смысл?
ах, понятно... Что ж, это действительно многое прояснило! Упоминается ли это вообще в какой-либо документации? В любом случае, спасибо! Это определенно тот ответ, который я искал.
Это приводит к ошибке, такой как TypeError: Argument 1 passed to Symfony\Component\HttpFoundation\Request::__construct() must be of the type array, object given,
@Shulz Вышеприведенный псевдокод предназначен для иллюстрации того, как он работает, и не предназначен для использования.
вы можете написать так:
function example(Request $request) {
$productRequest = new ProductRequest($request->all());
$promoRequest = new PromoRequest($request->all());
}
но при проверке вы должны изменить путь к этому:
$data = $productRequest->validate($productRequest->rules());
другой способ, который я тестирую в laravel 8, - добавить оба объекта запроса формы в параметры methd, например:
function example(ProductRequest $productRequest,PromoRequest $promoRequest) {
$productRequest->validated();
$promoRequest->validated();
}
Вы помещаете значения, такие как экземпляры, определение класса (ленивая загрузка) и т. д., в контейнер. Затем дайте то, что нужно, технически используя Reflection для чтения параметров метода класса контроллера для вышеуказанного случая.