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.
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
@Serge Blick auf Laravel Dokumentation auf Middleware und haben etwas eingerichtet, aber keine Decodierung auftritt. –