J'ai des URL qui ressemblent à:
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...
Dans mes contrôleurs, j'ai des fonctions qui ressemblent à:
public function user_get_endpoint(Request $request){
$request = $request->toArray();
return UserModel::where($request)->get()->toArray();
}
Ce qui précède est actuellement interrompu car l'objet $request
contient une propriété appelée api_token
qui n'existe pas dans la table user
. J'utilise le api_token
dans un middleware pour vérifier l'authentification.
Je peux supprimer manuellement la propriété api_token
dans chacune de mes fonctions d'API à l'aide de unset($request['api_token']
, mais j'aimerais éviter cela si possible.
Existe-t-il de toute façon une application large, ou au niveau d'une classe ou d'un contrôleur?
Peut-être que vous voulez le middleware global ?
Commencez par faire en sorte que le middleware s'exécute sur toutes les routes:
// routes.php
$app->middleware([
App\Http\Middleware\Apitoken::class
]);
Puis définissez ce que le middleware doit faire:
// 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 fournit des fonctions d'ajout et de suppression pour ajouter et supprimer de nouvelles propriétés à l'objet de requête, respectivement.
$request->request->add(['api_token' => 'api_token']); // to add new property to $request
$request->request->remove('api_token'); // to remove property from $request
Comme @JanWillem l'a dit dans les commentaires, vous pouvez utiliser except()
pour supprimer les paramètres que vous lui transmettez:
public function user_get_endpoint(Request $request){
return UserModel::where($request->except('api_token'))->get();
}
https://laravel.com/docs/5.2/requests#retrieving-input puis faites défiler jusqu'à Retrieving A Portion Of The Input Data
De plus, vous n'avez pas besoin d'utiliser toArray()
avec la réponse car Laravel le fera automatiquement pour vous.
J'espère que cela t'aides!
Idéalement, vous devriez envoyer votre api_token
dans les en-têtes de requête au lieu des paramètres Uri.
Si vous utilisez le middleware auth:api
de Laravel pour l'authentification, vous pouvez envoyer api_token
dans les en-têtes en tant que:
$response = $client->request('GET', '/api/user', [
'headers' => [
'Accept' => 'application/json',
'Authorization' => 'Bearer '.$accessToken,
],
]);
Alors api_token ne viendra jamais dans vos paramètres Uri.
Une solution qui fonctionne pour toutes les méthodes HTTP (pas seulement pour GET et HEAD):
$except = ['api_token'];
$request = request();
$cleanup = $request->except($except);
$request->query = new \Symfony\Component\HttpFoundation\ParameterBag($cleanup);