web-dev-qa-db-ja.com

Laravel 5-コントローラーレベルですべてのリクエストオブジェクトからパラメーターを削除

次のような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']プロパティを手動で設定解除できますが、可能であればそれを避けたいと思います。

とにかくこのアプリケーション全体で、またはクラスまたはコントローラーレベルで行う方法はありますか?

8
Lloyd Banks

おそらく 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);
    }
}
12
bishop

Laravelは、リクエストオブジェクトに新しいプロパティを追加および削除するための追加および削除機能を提供します。

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

方法1

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

同様に、不要なキーをスキップする簡単な方法を提供します

方法2

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

他のすべての不要なキーをスキップする簡単な方法を提供します、私は両方がほぼすべてのシナリオに合理的に良いと思います

2
justnajm

すべてのHTTPメソッド(GETおよびHEADだけでなく)で機能するソリューション:

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

@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は自動的にこれを行います。

お役に立てれば!

0
Rwd

理想的には、Uriパラメータではなく、リクエストヘッダーでapi_tokenを送信する必要があります。

Laravelのauth:apiミドルウェアを認証に使用している場合、ヘッダーでapi_tokenを次のように送信できます。

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

そうすると、api_tokenはUriパラメーターに含まれなくなります。

0
Amit Gupta