【发布时间】:2018-02-26 09:03:08
【问题描述】:
我正在尝试将函数绑定到路由,以便全局生效。 基本上我使用 Hashids 来混淆 ID,并且希望能够在路由级别解码 ID,因此我不需要在不同控制器中使用 ID 的任何地方都这样做。
我尝试在 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);
但是好像没什么效果。
在路由文件的底部,我有几条使用我要解码的 ID 的路由:
$api->get('leads/{id}', 'App\\Api\\V1\\Controllers\\LeadController@show');
$api->put('leads/update/{id}', 'App\\Api\\V1\\Controllers\\LeadController@update');
真的不知道如何让它工作,我试过使用 $api->bind 和其他方法,但它们都调用未定义的函数。
当然这是一件容易的事,但我刚刚开始使用 Laravel,所以目前这有点超出我的能力。
非常感谢!
根据 Serge 给我的提示,我试图将此功能移至中间件,但由于完全缺乏理解,这不起作用。
我有以下中间件:
<?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);
}
}
我已将其添加到 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,
];
}
并将其添加到 api 路由文件中:
$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\\LeadController@show');
});
我没有收到任何错误,但 ID 在传递到控制器时没有被解码。
【问题讨论】:
-
您熟悉中间件吗?给这只猫剥皮的多种方法...您可以扫描所有请求并在中间件中动态转换它们,或者将特定中间件附加到需要它的路由...
-
@Serge 查看了有关中间件的 Laravel 文档并进行了设置,但没有进行解码。
标签: php laravel routes middleware dingo-api