Создайте объект запроса Laravel на лету

Я обрабатываю данные в одном контроллере и хочу передать его дальше на другой контроллер, чтобы избежать дублирования кода.

Есть ли способ настроить объект запроса, который необходим в другом контроллере store -метод? Я проследил наследование запроса и пришел к объекту Symfony Request, у которого есть свойство request, которое на самом деле является ParameterBag, которое содержит метод add для добавления в него параметров со значениями.

Я пробовал следующее, но получаю null как результат:

$myRequest = new Request();
$myRequest->request->add(['foo' => 'bar']);
var_dump($myRequest->foo);

Я на Laravel 5.1 для этого проекта.

Ответ 1

Вы можете использовать replace():

$request = new \Illuminate\Http\Request();

$request->replace(['foo' => 'bar']);

dd($request->foo);

В качестве альтернативы было бы более целесообразно создать Job для всех, что происходит во втором контроллере, и удалить интерфейс ShouldQueue, чтобы заставить его работать синхронно.

Надеюсь, это поможет!

Ответ 2

Создание объекта запроса с помощью $myRequest = new Request(); создает объект с method = 'GET'. Вы можете проверить свой метод запроса с помощью $myRequest->getMethod(). Поскольку свойство request содержит данные для запросов POST, вы не можете использовать $myRequest->request->add() по умолчанию. Сначала вы должны установить метод запроса POST:

$myRequest = new \Illuminate\Http\Request();
$myRequest->setMethod('POST');
$myRequest->request->add(['foo' => 'bar']);
dd($request->foo);

Кстати, используя $myRequest->query->add(), вы можете добавить данные в запрос GET.

Ответ 3

Вы можете добавить параметр запроса на лету, используя эти методы.

замещать

заменить функцию док

Если вы находитесь в контроллере, передайте объект запроса в параметре функции, например

  function createUser(Illuminate\Http\Request $request){
     $request->replace(array_merge(array("new_key1"=>"new_value1","new_key_n"=>"new_value_n"), $request->all()));
}

Функция слияния

функция слияния док

function createUser(Illuminate\Http\Request $request){
     $request->merge(array("new_key1"=>"new_value1","new_key_n"=>"new_value_n"));
}

добавить функцию

 function createUser(Illuminate\Http\Request $request){
     $request->request->add(array_merge(array("new_key1"=>"new_value1","new_key_n"=>"new_value_n"), $request->all()));
}

Примечание: во всей функции мы расширяем запрос, значит, предыдущий параметр останется там. Вы будете добавлять свои собственные. Вы можете заменить их всех.

Ответ 4

Чтобы "избежать дублирования кода", вам необходимо абстрагировать общую функциональность в выделенный класс, дать ему правильное мнемоническое имя, написать вокруг него набор модульных тестов, а затем смоделировать его в контроллерах при тестировании модулей.

но если вам все еще нужно делать запросы:

use Illuminate\Http\Request;

$request = new Request([
        'name'   => 'unit test',
        'number'  => 123,
    ]);

и если вам нужна полная функциональность запроса, вам нужно добавить несколько дополнительных строк

$request
            ->setContainer(app())
            ->setRedirector(app(\Illuminate\Routing\Redirector::class))
            ->validateResolved();