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

时间:2016-10-28 19:54:32

标签: 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...

在我的控制器中,我的功能如下:

public function user_get_endpoint(Request $request){

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

}

由于$request对象包含api_token表中不存在的名为user的属性,因此上述内容将会中断。我在中间件中使用api_token来检查身份验证。

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

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

6 个答案:

答案 0 :(得分:14)

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

 $request->request->add(['api_token' => 'api_token']); // to add new property to $request
    $request->request->remove('api_token'); // to remove property from $request

答案 1 :(得分:9)

也许你想要global middleware

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

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

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

// 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);
    }
}

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

方法1

$request->except(['key1','key2',....])

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

方法2

$request->only(['key3','key4',....])

提供了一种跳过所有其他不需要键的简便方法,我发现这两种方法几乎适用于所有情况

答案 4 :(得分:0)

理想情况下,您应该在请求标头中发送api_token而不是Uri参数。

如果您使用Laravel的auth:api中间件进行身份验证,则可以在标头中发送api_token

$response = $client->request('GET', '/api/user', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.$accessToken,
    ],
]);

然后api_token永远不会进入你的Uri params。

答案 5 :(得分:0)

正如@JanWillem在评论中所说,您可以使用except()来删除传递给它的参数:

public function user_get_endpoint(Request $request){

    return UserModel::where($request->except('api_token'))->get();
}

https://laravel.com/docs/5.2/requests#retrieving-input然后向下滚动到Retrieving A Portion Of The Input Data

此外,您不必使用toArray()作为回复,因为Laravel会自动为您执行此操作。

希望这有帮助!