【问题标题】:Laravel 5.4 Dingo Route BindingLaravel 5.4 Dingo 路由绑定
【发布时间】: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


【解决方案1】:

感谢 Serge 的帮助,我成功完成了中间件。

中间件如下,它用解码后的值更新Route ID Parameter,并将这个中间件添加到内核中。

<?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 社区在此处和其他网站上提供的帮助和回复。希望这对其他人有所帮助。

【讨论】:

    猜你喜欢
    • 2018-01-18
    • 2017-07-22
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 2021-01-02
    • 2017-09-20
    相关资源
    最近更新 更多