Laravel: Как решить и обработать маршрут? - PullRequest
0 голосов
/ 02 июня 2018

Я могу видеть из index.php, как вернуть объект $response на четыре a Http\Request:

$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

$response = $kernel->handle(
    $request = Illuminate\Http\Request::capture()
);

Это почти то, что я хочу сделать, но мне нужно поменять маршрут иPOST-параметры для нового.В частности, у меня есть что-то вроде этого:

class AjaxLoaderController extends Controller {

    public static function endpoint(\Illuminate\Http\Request $httpRequest) {

        $kernel = app()->make(Illuminate\Contracts\Http\Kernel::class);

        foreach($httpRequest->request->get('requests',[]) as $subReq) {
            $newReq = $httpRequest->duplicate(null,$subReq['data']);
            // how can I change the URL for $newReq to the resolved path for an arbitrary route name?

            $subRes = $kernel->handle($newReq);

            \Kymark\Dbg::log('$subReq',$subReq);
        }
    }
}

Где $subReq выглядит так:

array:1 [
  0 => array:2 [
    "route" => "survey"
    "data" => array:1 [
      "companyId" => 3
    ]
  ]
]

Так что я хочу преобразовать «опрос» в URL, чтобы яможет вставить его в $newReq, а затем выполнить «горячую» замену данных POST в $httpRequest «данными», а затем запустить их через обычный конвейер Laravel, чтобы он вызвал новое действие контроллера и дал мне новый ответ.

1 Ответ

0 голосов
/ 02 июня 2018

то, что вы делаете, поместит вас в бесконечный цикл: (

, потому что вы не меняете маршрут.

Если я хочу это сделать, я создам новый запрос, затем добавьтеданные к нему

, которые вы должны добавить \ before Illuminate ...

$kernel = app()->make(\Illuminate\Contracts\Http\Kernel::class);

... и внутри своего цикла:

//$newReq = $request->duplicate(null,$subReq);
$newReq = Request::create($subReq['route'], 'POST', $subReq['data']);

$subRes = $kernel->handle($newReq);
$subRes->send();

наконец, вы не должны забыватьcsrf, поскольку вы отправляете почтовый запрос, вам нужно исключить маршруты subReq из csrf или отправить токен с запросом,

, кроме которого вы можете:

app/Http/Middleware/VerifyCsrfToken.php

или вы можете:

  1. Элемент списка
  2. дублировать запрос. Проверьте это: метод дублирования
  3. получить сервер запросов
  4. измените его на то, что вам нужно
  5. , затем инициализируйте новый запрос с новыми параметрами
  6. , затем отправьте маршрут с новым запросом: D

код:

        $subReq = [
            "route" => "survey",
            "data" => [
                "companyId" => 3,
                '_token' => csrf_token(), // if you dont want to except csrf
            ],
        ];


        $server = $request->server();

        $server['REQUEST_METHOD'] = 'POST'; // add it if you are initially sending a GET,
        $server['REQUEST_URI'] = $subReq['route'];

        $newRequest = $request->duplicate(null, $subReq['data'], null, null, null, $server);
        $newRequest->initialize([], $subReq['data'], [], $request->cookie(), [], $server, null);

        app()->instance('request', $newRequest);
        \Route::dispatch($newRequest);

         // or you can still do this
        // $kernel = app()->make(\Illuminate\Contracts\Http\Kernel::class);
        // $subRes = $kernel->handle($newRequest);
        // $subRes->send();

теперь, если вы изначально отправляете запрос POST, вам не нужно добавлять тип метода post в SERVER, но если нет, вам нужно добавить его, и вы должны исключить csrf или добавить его к атрибутам

Кстати, вы все равно можете сделать в конце:

$kernel = app()->make(\Illuminate\Contracts\Http\Kernel::class);
$subRes = $kernel->handle($newRequest);
$subRes->send();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...