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.
Ê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
@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. –