laravel 修改laravel中间件中的输入
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/33975721/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Modify input in laravel middleware
提问by Victor
Some service makes HTTP request to my site and passes some input. This input has a little bit wrong structure for me, so I'm trying to modify it.
某些服务向我的站点发出 HTTP 请求并传递一些输入。这个输入的结构对我来说有点错误,所以我正在尝试修改它。
I made a middleware and attached this middleware to my route. The handle method looks like this:
我制作了一个中间件并将这个中间件附加到我的路线上。句柄方法如下所示:
public function handle($request, Closure $next)
{
$input = $request->all();
// Input modification
$request->replace($input);
\Log::info($request->all()); // Shows modified request
return $next($request);
}
However in my controller I got old input. Also I'm a little bit confused since I also use FormRequest, and as I realize these two requests are different entities. Then how can I modify the input in the middleware?
但是在我的控制器中,我得到了旧的输入。另外我有点困惑,因为我也使用 FormRequest,而且我意识到这两个请求是不同的实体。那么如何修改中间件中的输入呢?
回答by Marcin Nabia?ek
I don't know what's the exact problem in your case but I'll show you what I did to make it work and it might solve your problem:
我不知道你的情况的确切问题是什么,但我会告诉你我做了什么使它工作,它可能会解决你的问题:
app/Http/Middleware/TestMiddleware.php
应用程序/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);
}
}
app/Http/Kernel.php
应用程序/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
];
app/Http/routes.php
应用程序/Http/routes.php
Route::get('/test', ['uses' => 'TestController@index']);
app/Http/Requests/SampleRequest.php
应用程序/Http/Requests/SampleRequest.php
<?php namespace App\Http\Requests;
class SampleRequest extends Request
{
public function rules()
{
return [
'int' =>
[
'required',
'integer'
],
'text' => [
'max: 5',
]
];
}
}
app/Http/Controllers/TestController.php
应用程序/Http/Controllers/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());
}
}
In console I've run composer dump-autoload
.
在控制台中,我运行了composer dump-autoload
.
Now when I run the following url:
现在,当我运行以下网址时:
http://testproject.app/test?mod=23-tav
I'm getting in controller from dd
:
我从dd
以下位置进入控制器:
array:2 [▼
"text" => "tav"
"int" => "23"
]
as expected and when I run for example http://testproject.app/test?mod=abc-tav
I'm being redirected to mainpage in my case because data doesn't pass validation from SampleRequest
(int
is not integer)
正如预期的那样,例如当我运行时,http://testproject.app/test?mod=abc-tav
我被重定向到主页,因为数据没有通过验证SampleRequest
(int
不是整数)