Как метод контроллера Laravel обрабатывает несколько параметров запроса формы?

Я возвращаюсь к 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 узнает, как разделить запрос на два отдельных класса запроса формы?

Пожалуйста, не стесняйтесь, дайте мне знать, если и как я могу объяснить свой вопрос более четко.

Вы помещаете значения, такие как экземпляры, определение класса (ленивая загрузка) и т. д., в контейнер. Затем дайте то, что нужно, технически используя Reflection для чтения параметров метода класса контроллера для вышеуказанного случая.

Chay22 30.04.2019 09:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
1
764
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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 разных класса запросов? Имеет ли этот вопрос смысл?

CJC 30.04.2019 09:18

ах, понятно... Что ж, это действительно многое прояснило! Упоминается ли это вообще в какой-либо документации? В любом случае, спасибо! Это определенно тот ответ, который я искал.

CJC 01.05.2019 03:50

Это приводит к ошибке, такой как TypeError: Argument 1 passed to Symfony\Component\HttpFoundation\Request::__construct() must be of the type array, object given,

Shulz 31.05.2021 19:22

@Shulz Вышеприведенный псевдокод предназначен для иллюстрации того, как он работает, и не предназначен для использования.

Nicklas Kevin Frank 01.06.2021 07:25

вы можете написать так:

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();
}

Другие вопросы по теме