wake-up-neo.com

Laravel 5 - Entfernen Sie die Parameter aus allen Anforderungsobjekten auf Controller-Ebene

Ich habe URLs, die wie folgt aussehen:

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...

In meinen Controllern habe ich Funktionen, die wie folgt aussehen:

public function user_get_endpoint(Request $request){

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

}

Das obige wird derzeit fehlschlagen, da das $request-Objekt eine Eigenschaft namens api_token enthält, die in der user-Tabelle nicht vorhanden ist. Ich verwende den api_token in einer Middleware, um die Authentifizierung zu überprüfen.

Ich kann die api_token-Eigenschaft in jeder meiner API-Funktionen mithilfe von unset($request['api_token'] manuell aufheben, aber ich möchte dies möglichst vermeiden.

Gibt es überhaupt eine Möglichkeit, diese Anwendung auf einer Klassen- oder Controller-Ebene durchzuführen?

6
Lloyd Banks

Vielleicht möchten Sie globale Middleware ?

Lassen Sie zunächst die Middleware auf allen Routen laufen:

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

Definieren Sie dann, was die Middleware tun soll:

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

Laravel bietet Funktionen zum Hinzufügen und Entfernen, um dem Anforderungsobjekt neue Eigenschaften hinzuzufügen bzw. zu entfernen.

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

Methode 1

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

bietet eine einfache Möglichkeit, unerwünschte Schlüssel zu überspringen

Methode 2

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

bietet eine einfache Möglichkeit, alle anderen unerwünschten Schlüssel zu überspringen, finde ich beides für fast alle Szenarien einigermaßen gut

2
justnajm

Wie @JanWillem in den Kommentaren sagte, können Sie except() verwenden, um die Parameter zu entfernen, die Sie daran übergeben:

public function user_get_endpoint(Request $request){

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

https://laravel.com/docs/5.2/requests#retrieving-input und blättern Sie dann zu Retrieving A Portion Of The Input Data herunter.

Außerdem müssen Sie toArray() nicht mit der Antwort verwenden, da Laravel dies automatisch für Sie erledigt.

Hoffe das hilft!

0
Ross Wilson

Idealerweise sollten Sie Ihren api_token in Anforderungsheader anstelle von Uri-Parametern senden.

Wenn Sie die auth:api-Middleware von Laravel für die Authentifizierung verwenden, können Sie api_token in Kopfzeilen wie folgt senden:

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

Dann wird api_token niemals in Ihre Uri-Params kommen.

0
Amit Gupta

Eine Lösung, die für alle HTTP-Methoden funktioniert (nicht nur für GET und HEAD): 

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