繁体   English   中英

Laravel 5.4 Dingo路线绑定

[英]Laravel 5.4 Dingo Route Binding

我试图将功能绑定到路由,以使其在全局范围内生效。 基本上,我使用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的帮助,我才得以完成中间件。

如下所示的中间件,它使用解码后的值更新Route ID参数 ,并将此中间件添加到内核中。

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

然后在API路由文件中,添加了一个使用“解码”中间件的新组:

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

然后当然可以向需要解码参数的组添加尽可能多的路由。

感谢Serge和Laravel社区在此以及其他站点上提供的帮助和回复。 希望这会帮助其他人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM