Создайте объект запроса 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();