2017-09-17 2 views
0

Je tente de lier une fonction au routage pour qu'elle prenne effet globalement. Fondamentalement, j'utilise Hashids pour masquer les ID, et je veux être capable de décoder l'ID au niveau de la route, donc je n'ai pas besoin de le faire partout où l'ID est utilisé dans différents contrôleurs.Laravel 5.4 Liaison de route Dingo

J'ai essayé de faire ce qui suit en haut du fichier routes api:

api.php

<?php 

    use Dingo\Api\Routing\Router; 
    use Hashids\Hashids; 

    Route::bind('id', function ($id) { 
     return Hasher::decode($id); 
    }); 

    /** @var Router $api */ 
    $api = app(Router::class); 

Mais il ne semble pas avoir d'effet.

J'ai deux ou trois routes qui utilisent l'ID que je veux décoder au fond des routes fichier:

$api->get('leads/{id}', 'App\\Api\\V1\\Controllers\\[email protected]'); 
$api->put('leads/update/{id}', 'App\\Api\\V1\\Controllers\\[email protected]'); 

vraiment à une perte sur la façon d'obtenir ce travail, j'ai essayé en utilisant $ api-> bind et d'autres mais ils appellent tous des fonctions non définies.

Bien sûr, c'est une chose facile, mais je ne fais que commencer avec Laravel, donc c'est un peu au-delà de moi à ce stade.

Merci beaucoup!


Basé sur le soupçon que Serge m'a donné, je l'ai essayé de déplacer cette fonctionnalité dans Middleware, mais encore en raison d'un manque de compréhension complète, cela ne fonctionne pas.

Je le middleware suivant:

<?php 

namespace App\Http\Middleware; 

use Closure; 
use Junity\Hashids\Facades\Hashids; 

class DecodeHashids 
{ 
    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 

     if($request->has('id')) 
      $request->id = Hasher::decode($request->id); 

     return $next($request); 
    } 
} 

Je l'ai ajouté à Kernal.php:

protected $middlewareGroups = [ 
     'web' => [ 
      \App\Http\Middleware\EncryptCookies::class, 
      \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, 
      \Illuminate\Session\Middleware\StartSession::class, 
      \Illuminate\View\Middleware\ShareErrorsFromSession::class, 
      \App\Http\Middleware\VerifyCsrfToken::class, 
      \Illuminate\Routing\Middleware\SubstituteBindings::class, 
     ], 

     'api' => [ 
      'throttle:60,1', 
      'bindings', 
      'decode', 
     ], 
    ]; 

    /** 
    * The application's route middleware. 
    * 
    * These middleware may be assigned to groups or used individually. 
    * 
    * @var array 
    */ 
    protected $routeMiddleware = [ 
     'auth' => \Illuminate\Auth\Middleware\Authenticate::class, 
     'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 
     'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 
     'can' => \Illuminate\Auth\Middleware\Authorize::class, 
     'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 
     'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 

     'jwt.auth' => GetUserFromToken::class, 
     'jwt.refresh' => RefreshToken::class, 

     'decode' => \App\Http\Middleware\DecodeHashids::class, 
    ]; 
} 

et ajouté dans les routes api fichier comme si:

$api->group(['middleware' => 'jwt.auth'], function(Router $api) { 
     $api->get('protected', function() { 
      return response()->json([ 
       'message' => 'Access to protected resources granted! You are seeing this text as you provided the token correctly.' 
      ]); 
     }); 

     $api->get('refresh', [ 
      'middleware' => 'jwt.refresh', 
      function() { 
       return response()->json([ 
        'message' => 'By accessing this endpoint, you can refresh your access token at each request. Check out this response headers!' 
       ]); 
      } 
     ]); 

     $api->group(['middleware' => 'decode'], function(Router $api) { 
      $api->get('leads/{id}', 'App\\Api\\V1\\Controllers\\[email protected]'); 
     }); 

Je n'obtiens aucune erreur, mais l'ID n'est pas décodé lorsqu'il passe au contrôleur.

+0

Êtes-vous familier avec le middleware? Beaucoup de façons de skin ce chat ... vous pouvez scanner toutes les requêtes et les transformer à la volée dans le middleware ou attacher le middleware spécifique aux routes qui en ont besoin ... – Serge

+0

@Serge J'ai regardé la documentation de Laravel sur le middleware et j'ai configuré quelque chose, mais aucun décodage n'est en cours. –

Répondre

0

Grâce à l'aide de Serge, j'ai réussi à compléter le Middleware. Middleware comme ci-dessous, il met à jour le Route ID Paramètre avec la valeur décodée, et ce middleware est ajouté au Kernal.

<?php 

namespace App\Http\Middleware; 

use Closure; 
use Hashids; 

class DecodeHashids 
{ 
    public function handle($request, Closure $next) 
    { 

     if($request->route()->parameters('id')) 
      $request->route()->setParameter('id', Hashids::decode($request->id)); 

     return $next($request); 
    } 
} 

Puis dans le fichier de route de l'API, j'ai ajouté un nouveau groupe qui utilise le « décodage » Middleware:

$api->group(['middleware' => 'decode'], function(Router $api) { 
    $api->get('leads/{id}', 'App\\Api\\V1\\Controllers\\[email protected]'); 
}); 

peut alors d'ajouter bien sûr autant de voies à ce groupe où les paramètres doivent décodés. Merci Serge et la communauté Laravel pour l'aide et les réponses sur ce site et sur d'autres sites. Espérons que cela aidera les autres.