2017-09-17 6 views
0

Ich versuche, eine Funktion an das Routing zu binden, so dass es global wirksam wird. Grundsätzlich verwende ich Hashids, um die IDs zu verschleiern, und möchte die ID auf der Route-Ebene dekodieren, so dass ich es nicht überall dort tun muss, wo die ID in verschiedenen Controllern verwendet wird.Laravel 5.4 Dingo Route Bindung

Ich habe versucht, die folgenden an der Spitze der api Routen zu tun, Datei:

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

Aber es spielt keine Wirkung zu haben scheinen.

Ich habe ein paar Routen, die die ID-I an der Unterseite der Routen entschlüsseln will verwenden Datei:

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

wirklich ratlos, wie diese Arbeit zu bekommen, ich habe versucht, mit $ api> bind und anderen, aber sie alle nennen undefinierte Funktionen.

Sicher ist das eine einfache Sache, aber ich fange gerade mit Laravel an, also ist dieses ein bisschen jenseits von mir an diesem Punkt.

Vielen Dank!


auf den Hinweis aus, dass Serge hat mir, ich versucht habe, diese Funktionalität in Middleware zu bewegen, aber wegen noch ein volles Unverständnis, das nicht funktioniert.

Ich habe folgende Middleware:

<?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); 
    } 
} 

ich es Kernal.php hinzugefügt haben:

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, 
    ]; 
} 

und fügte hinzu, es in den api Routen-Datei als so:

$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]'); 
     }); 

Ich bekomme keine Fehler, aber die ID wird nicht dekodiert, wenn es an die Steuerung weitergegeben wird.

+0

Kennen Sie Middleware? Viele Möglichkeiten, diese Katze zu häuten ... Sie könnten alle Anfragen scannen und sie sofort in der Middleware transformieren oder die spezifische Middleware an die Routen anhängen, die sie brauchen ... – Serge

+0

@Serge Blick auf Laravel Dokumentation auf Middleware und haben etwas eingerichtet, aber keine Decodierung auftritt. –

Antwort

0

Dank der Hilfe von Serge konnte ich die Middleware fertigstellen.

Middleware wie unten, aktualisiert es die Route ID Parameter mit dem decodierten Wert, und diese Middleware wird dem Kernal hinzugefügt.

<?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); 
    } 
} 

dann in der API-Routendatei, fügte ich eine neue Gruppe, die die ‚decode‘ Middleware verwendet:

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

kann dann natürlich fügen Sie so viele Routen zu dieser Gruppe, wo Parameter decodiert müssen.

Danke Serge und die Laravel-Community für die Hilfe und Antworten auf hier und anderen Seiten. Hoffentlich hilft das anderen.