Laravel Auth в статическом классе «Нестатический метод» ошибка - PullRequest
0 голосов
/ 16 мая 2018

Я создаю класс, который обрабатывает скучную аутентификацию в одном файле.
Но у меня небольшая проблема с вызовом функций аутентификации.

Первая проблема, с которой я сталкиваюсь, связана с этой функцией:

hasTooManyLoginAttempts

Код

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

Ошибка триггеров:

Using $this when not in object context

Когда я изменяю $ this-> на self ::

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

Триггеры

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

Пример класса, с которым я пытаюсь работать

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 голосов
/ 16 мая 2018

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 в комментариях, фасад также может работать, но «хитрость» примерно такая же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...