次のようなURLがあります。
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
オブジェクトにはuser
テーブルに存在しないapi_token
というプロパティが含まれているため、上記は現在中断します。ミドルウェアでapi_token
を使用して認証を確認しています。
api_token
を使用して、各API関数のunset($request['api_token']
プロパティを手動で設定解除できますが、可能であればそれを避けたいと思います。
とにかくこのアプリケーション全体で、またはクラスまたはコントローラーレベルで行う方法はありますか?
おそらく 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);
}
}
Laravelは、リクエストオブジェクトに新しいプロパティを追加および削除するための追加および削除機能を提供します。
$request->request->add(['api_token' => 'api_token']); // to add new property to $request
$request->request->remove('api_token'); // to remove property from $request
$request->except(['key1','key2',....])
同様に、不要なキーをスキップする簡単な方法を提供します
$request->only(['key3','key4',....])
他のすべての不要なキーをスキップする簡単な方法を提供します、私は両方がほぼすべてのシナリオに合理的に良いと思います
すべてのHTTPメソッド(GETおよびHEADだけでなく)で機能するソリューション:
$except = ['api_token'];
$request = request();
$cleanup = $request->except($except);
$request->query = new \Symfony\Component\HttpFoundation\ParameterBag($cleanup);
@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は自動的にこれを行います。
お役に立てれば!
理想的には、Uriパラメータではなく、リクエストヘッダーでapi_token
を送信する必要があります。
Laravelのauth:api
ミドルウェアを認証に使用している場合、ヘッダーでapi_token
を次のように送信できます。
$response = $client->request('GET', '/api/user', [
'headers' => [
'Accept' => 'application/json',
'Authorization' => 'Bearer '.$accessToken,
],
]);
そうすると、api_tokenはUriパラメーターに含まれなくなります。