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?
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);
}
}
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
$request->except(['key1','key2',....])
bietet eine einfache Möglichkeit, unerwünschte Schlüssel zu überspringen
$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
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!
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.
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);