2015-11-28 6 views
1

Некоторые службы делают HTTP-запрос на мой сайт и передают некоторый ввод. Этот вход имеет немного неправильную структуру для меня, поэтому я пытаюсь изменить его.Изменение ввода в промежуточном программном обеспечении laravel

Я сделал промежуточное ПО и привязал это промежуточное ПО к своему маршруту. Метод ручки выглядит так:

public function handle($request, Closure $next) 
{ 
    $input = $request->all(); 

    // Input modification 

    $request->replace($input); 
    \Log::info($request->all()); // Shows modified request 

    return $next($request); 
} 

Однако в моем контроллере я получил старый ввод. Кроме того, я немного запутался, так как я также использую FormRequest, и, как я понимаю, эти два запроса являются разными сущностями. Тогда как я могу изменить вход в промежуточное ПО?

+0

Это Laravel 5 или 5,1? – Kyslik

+0

можете ли вы отправить этот метод '$ request-> replace()', чтобы мы могли видеть, что он делает? – djt

+0

Это Laravel 5.1 'replace()' метод построен в Laravel, это не мой собственный метод – Victor

ответ

0

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

приложение/HTTP/Middleware/TestMiddleware.php

<?php namespace App\Http\Middleware; 

use Closure; 

class TestMiddleware 
{ 

    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     $input = $request->all(); 

     if (isset($input['mod'])) { 
      list($input['int'], $input['text']) = explode('-', $input['mod']); 
      unset($input['mod']); 
      // Input modification 
      $request->replace($input); 

      \Log::info($request->all()); // Shows modified request 
     } 

     return $next($request); 
    } 

} 

приложение/Http/Kernel.php

protected $middleware = [ 
    'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode', 
    'Illuminate\Cookie\Middleware\EncryptCookies', 
    'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse', 
    'Illuminate\Session\Middleware\StartSession', 
    'Illuminate\View\Middleware\ShareErrorsFromSession', 
    'App\Http\Middleware\VerifyCsrfToken', 
    Middleware\TestMiddleware::class, // this line added 
]; 

приложение/Http/routes.php

Route::get('/test', ['uses' => '[email protected]']); 

приложение/HTTP/Запросы/SampleRequest.php

<?php namespace App\Http\Requests; 

class SampleRequest extends Request 
{   
    public function rules() 
    { 
     return [ 
      'int'    => 
       [ 
        'required', 
        'integer' 
       ], 
      'text' => [ 
       'max: 5', 
      ] 
     ]; 
    } 
} 

приложение/Http/Контроллеры/TestController.php

<?php namespace App\Http\Controllers; 

use App\Http\Requests; 


class TestController extends \Illuminate\Routing\Controller 
{ 

    public function index(Requests\SampleRequest $request) 
    { 
     dd($request->all()); 

    } 
} 

В консоли я запустил composer dump-autoload.

Теперь, когда я бегу по следующему адресу:

http://testproject.app/test?mod=23-tav 

Я получаю от контроллера dd:

array:2 [▼ 
    "text" => "tav" 
    "int" => "23" 
] 

как и ожидалось, и когда я бегу к примеру http://testproject.app/test?mod=abc-tav я перенаправлены в моем случае, поскольку данные не прошли проверку с SampleRequest (int не являются целыми)

+0

Очень странно. Он работает, когда я делаю запросы с помощью браузера или почтальона, но в моем случае я пытался сделать это из ngrok (в основном я тестировал webhook). В случае ngrok это не работает – Victor

+0

Согласно этому (https://github.com/laravel/internals/issues/48), существует вероятность того, что FormRequest игнорирует промежуточное программное обеспечение при определенных обстоятельствах. – Anfelipe

+0

Если вы хотите изменить одно значение, вы можете использовать $ request-> offsetSet (строка $ offset, mixed $ value); https://laravel.com/api/5.4/Illuminate/Http/Request.html#method_offsetSet –