Laravel Auth in static class"非静态方法"错误

时间:2018-05-16 08:34:14

标签: php laravel laravel-5.6

我正在制作一个在一个文件中处理无聊的auth东西的课程 但是我在调​​用auth函数方面遇到的问题很小。

我遇到的第一个问题是这个功能:

hasTooManyLoginAttempts

代码

if ($this->hasTooManyLoginAttempts($request)) {

触发错误:

Using $this when not in object context

当我更改$ this->自我::

if (self::hasTooManyLoginAttempts($request)) {

触发器

Non-static method My\AuthClass::hasTooManyLoginAttempts() should not be called statically

示例课程I尝试使用

namespace My\AuthClass;

use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Support\Facades\Auth;

class AuthClass
{
    use AuthenticatesUsers;

    public static function doLogin(Request $request)
    {
        // Validate login

        // Has too many login attempts?

        if (self::hasTooManyLoginAttempts($request)) {
            self::fireLockoutEvent($request);
            return redirect()->route('login.show')->with('error', 'You have tried to login too many times in short amount of time. Please try again later.');
        }

        // Try authenticate

        // Send login error
    }
}

帮助表示赞赏!

1 个答案:

答案 0 :(得分:1)

public static function doLogin(Request $request)显然是静态函数,而hasTooManyLoginAttempts则不是。

您不能使用双冒号调用它,也不能在静态上下文中使用$this。相当困境。

您必须创建一种解决方法:

class AuthClass
{
  use AuthenticatesUsers;

  private static $instance = null;

  public static function doLogin(Request $request)
  {
    // Validate login

    $self = self::init();

    // Has too many login attempts?
    if ($self->hasTooManyLoginAttempts($request)) {
      $self->fireLockoutEvent($request);
      return redirect()->route('login.show')->with('error', 'You have tried to login too many times in short amount of time. Please try again later.');
    }

    // Try authenticate

    // Send login error
  }

  public static function init() {
    if(null === self::$instance) {
      self::$instance = new self;
    }

    return self::$instance;
  }
}

这里的重要部分是新的init()功能(您可以根据需要为其命名)。它将创建当前类的新实例,并允许您在“静态”上下文中使用->(它不是真正的静态)。

正如用户Tuim在评论中指出的那样,门面也可以起作用,但“技巧”大致相同。