Laravel 5 - 从控制器级别的所有请求对象中删除参数

Llo*_*nks 10 laravel laravel-5 laravel-5.2

我的网址看起来像:

http://example.com/api/user?id=45&name=mike&api_token=2348283
http://example.com/api/project?id=5&description=first&api_token=2348283
etc...
Run Code Online (Sandbox Code Playgroud)

在我的控制器中,我的功能看起来像:

public function user_get_endpoint(Request $request){

    $request = $request->toArray();
    return UserModel::where($request)->get()->toArray();

}
Run Code Online (Sandbox Code Playgroud)

由于$request对象包含一个api_tokenuser表中不存在的属性,因此上面将会中断.我正在使用api_token中间件来检查身份验证.

我可以api_token通过使用手动取消设置每个API函数中的属性unset($request['api_token'],但是如果可能的话我想避免这种情况.

无论如何要在应用程序范围内或在类或控制器级别执行此操作?

Sha*_*eza 19

Laravel提供了添加和删除功能,分别为请求对象添加和删除新属性.

 $request->request->add(['api_token' => 'api_token']); // to add new property to $request
    $request->request->remove('api_token'); // to remove property from $request
Run Code Online (Sandbox Code Playgroud)


jus*_*ajm 15

方法一

$request->except(['key1','key2',....])
Run Code Online (Sandbox Code Playgroud)

类似地,提供了一种跳过不需要的键的简单方法

方法二

$request->only(['key3','key4',....])
Run Code Online (Sandbox Code Playgroud)

提供了一种跳过所有其他不需要的键的简单方法,我发现它们几乎适用于所有场景

  • 警告:这将返回一个数组而不是 Request 对象。 (2认同)

bis*_*hop 12

也许你想要全球中间件

首先安排中间件在所有路由上运行:

// routes.php
$app->middleware([
    App\Http\Middleware\Apitoken::class
]);
Run Code Online (Sandbox Code Playgroud)

然后定义中间件应该做什么:

// src/App/Http/Middleware/Apitoken.php
<?php
namespace App\Http\Middleware;

use Closure;

class Apitoken
{
    public function handle($request, Closure $next)
    {
        unset($request['api_token']);

        return $next($request);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的解决方案。Laravel甚至可以通过$ request-&gt; offsetUnset('api_token');获得语法糖。 (2认同)
  • 在 Laravel 8 中,至少 offsetUnset() 也可以与 POST 一起使用。这是因为它不关心方法: `$this-&gt;getInputSource()-&gt;remove($offset);` (Illuminate\Http\Request) (2认同)

fic*_*489 6

适用于所有 HTTP 方法的解决方案(不仅适用于 GET 和 HEAD):

$except = ['api_token'];
$request = request();
$cleanup = $request->except($except);
$request->query = new \Symfony\Component\HttpFoundation\ParameterBag($cleanup);
Run Code Online (Sandbox Code Playgroud)