web-dev-qa-db-fra.com

Laravel 5 - Supprimer le paramètre de tous les objets de demande au niveau du contrôleur

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?

6
Lloyd Banks

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

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
12
Shams Reza

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!

0
Ross Wilson

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.

0
Amit Gupta

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);
0
fico7489