Php Laravel Throttle中间件:是否有回调/处理程序?

Php Laravel Throttle中间件:是否有回调/处理程序?,php,laravel,laravel-5,throttling,Php,Laravel,Laravel 5,Throttling,我想使用,但我也想记录任何用户尝试次数过多的情况 是否有任何回调/处理程序,我可以在其中检测并处理它 假设我有一条这样的路线: Route::get('foo', array('before' => 'throttle:5,10', function () { return 'You shall pass!'; }, )); 如果达到最大计数,将触发此事件: Illuminate\Auth\Events\Lockout 所以你可以听听 protected $listen = [

我想使用,但我也想记录任何用户尝试次数过多的情况

是否有任何回调/处理程序,我可以在其中检测并处理它

假设我有一条这样的路线:

Route::get('foo', array('before' => 'throttle:5,10', function () {
    return 'You shall pass!';
}, ));

如果达到最大计数,将触发此事件:

Illuminate\Auth\Events\Lockout
所以你可以听听

protected $listen = [
    ...
    'Illuminate\Auth\Events\Lockout' => [
        'App\Listeners\LogLockout',
    ],
];

如果达到最大计数,将触发此事件:

Illuminate\Auth\Events\Lockout
所以你可以听听

protected $listen = [
    ...
    'Illuminate\Auth\Events\Lockout' => [
        'App\Listeners\LogLockout',
    ],
];

您只需扩展
ThrottleRequests
类并重新声明其
构建异常
,或尝试处理其异常(
\Symfony\Component\HttpKernel\exception\HttpException
,尝试次数太多)在
app/Exceptions/Handler.php

内部,您可以扩展
ThrottleRequests
类并重新声明其
buildException
,或者尝试在
app/Exceptions/Handler.php内部处理其异常(
\Symfony\Component\HttpKernel\exception\HttpException
,尝试次数太多)。

illumb\Auth\Events\lock
事件仅在
illumb\Foundation\Auth\ThrottlesLogins
中触发,但您仍然可以手动触发它

我就是这样做的:

  • app/Exceptions/Handler.php
    中添加以下
    use
    语句:
  • 使用light\Auth\Events\lock;
    使用Symfony\Component\HttpKernel\Exception\HttpException;
    
  • 将此添加到同一文件的
    报告
    方法中:
  • if($HttpException的异常实例){
    if('尝试次数太多。'=$exception->getMessage()){
    事件(新锁定(请求());
    }
    }
    
  • 执行
    php artisan make:listener LogThrottleLimitReached
    并将此代码添加到
    handle
    方法的
    app/Listeners/LogThrottleLimitReached.php
    文件中:
  • $request=$event->request;
    \日志::错误(sprintf)(
    '已达到限制速率限制。URL:%s,正文:%s,IP:%s',
    $request->url(),
    json_encode($request->all()),
    $request->ip()
    ));
    
  • app/Providers/EventServiceProvider.php
    中注册该侦听器:
  • 使用App\Listeners\LogThrottleLimitReached;
    使用Illumb\Auth\Events\Lockout;
    

    protected$listen=[
    锁定::类=>[
    LogThrottleLimitReached::类,
    ],
    ];
    
    illumb\Auth\Events\lock
    事件仅在
    illumb\Foundation\Auth\ThrottlesLogins
    中触发,但您仍然可以手动触发它

    我就是这样做的:

  • app/Exceptions/Handler.php
    中添加以下
    use
    语句:
  • 使用light\Auth\Events\lock;
    使用Symfony\Component\HttpKernel\Exception\HttpException;
    
  • 将此添加到同一文件的
    报告
    方法中:
  • if($HttpException的异常实例){
    if('尝试次数太多。'=$exception->getMessage()){
    事件(新锁定(请求());
    }
    }
    
  • 执行
    php artisan make:listener LogThrottleLimitReached
    并将此代码添加到
    handle
    方法的
    app/Listeners/LogThrottleLimitReached.php
    文件中:
  • $request=$event->request;
    \日志::错误(sprintf)(
    '已达到限制速率限制。URL:%s,正文:%s,IP:%s',
    $request->url(),
    json_encode($request->all()),
    $request->ip()
    ));
    
  • app/Providers/EventServiceProvider.php
    中注册该侦听器:
  • 使用App\Listeners\LogThrottleLimitReached;
    使用Illumb\Auth\Events\Lockout;
    

    protected$listen=[
    锁定::类=>[
    LogThrottleLimitReached::类,
    ],
    ];
    
    听起来不错,但我看不出它是否会在达到费率限制时触发事件。我也在看这个类,我没有看到它在哪里触发事件听起来很棒,但我看不到它在达到RateLimit时触发事件。我也在看这门课,我看不出它在哪里激发了一个像符咒一样的活动。谢谢我唯一更改的是在处理程序类内部检查异常类型是否为
    ThrottleRequestsException
    而不是
    HttpException
    ,然后比较
    429===$exception->getStatusCode()
    。效果非常好。谢谢我唯一更改的是在处理程序类内部检查异常类型是否为
    ThrottleRequestsException
    而不是
    HttpException
    ,然后比较
    429===$exception->getStatusCode()