我的网址如下:
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']
属性,但如果可能的话,我想避免这种情况。
无论如何都可以在应用程序范围内或在类或控制器级别执行此操作吗?
答案 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)
$request->except(['key1','key2',....])
类似地,提供了一种跳过不需要的键的简便方法
$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会自动为您执行此操作。
希望这有帮助!