PHP - Laravel - Токен метода черты не был применен, потому что есть конфликты с другими методами черты в App \ User - PullRequest
0 голосов
/ 27 августа 2018

Я пытаюсь реализовать поток без пароля для моего существующего приложения Laravel, в котором также реализован Laravel Passport.

Я создал новую черту MagicallyAuthenticatable, чтобы расширить класс User.php:

use Laravel\Passport\HasApiTokens;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use App\Auth\Traits\MagicallyAuthenticatable;


class User extends Authenticatable
{
    use HasApiTokens, Notifiable, MagicallyAuthenticatable;
    [ ... ]
}

Моя черта, как показано ниже:

namespace App\Auth\Traits;

trait MagicallyAuthenticatable
{
    public function storeToken()
    {
        $this->token()->delete();
        $this->token()->create([
            'token' => str_random(255)
        ]);

        return $this;
    }

    public function token()
    {
        return 'token'; //just for test
    }
}

Когда я пытаюсь войти, я получаю эту ошибку, хотя:

Токен метода черты не был применен, потому что есть конфликты с другими методами черты в App \ User

1 Ответ

0 голосов
/ 27 августа 2018

Это потому, что HasApiToken из пакета passport уже использует метод token().

    /**
     * Get the current access token being used by the user.
     *
     * @return \Laravel\Passport\Token|null
     */
    public function token()
    {
        return $this->accessToken;
    }

Согласно PHP документам,

Если две чертыПри вставке метода с тем же именем возникает фатальная ошибка, если конфликт явно не разрешен.

Чтобы разрешить конфликты имен между чертами, используемыми в одном классе, необходимо использовать оператор вместо, чтобы точно выбратьодин из конфликтующих методов.

Поскольку это позволяет исключать только методы, оператор as можно использовать для добавления псевдонима в один из методов.Обратите внимание, что оператор as не переименовывает метод и не влияет ни на какой другой метод.

Разрешение конфликтов

<?php
trait A {
    public function smallTalk() {
        echo 'a';
    }
    public function bigTalk() {
        echo 'A';
    }
}

trait B {
    public function smallTalk() {
        echo 'b';
    }
    public function bigTalk() {
        echo 'B';
    }
}

class Talker {
    use A, B {
        B::smallTalk insteadof A;
        A::bigTalk insteadof B;
    }
}

class Aliased_Talker {
    use A, B {
        B::smallTalk insteadof A;
        A::bigTalk insteadof B;
        B::bigTalk as talk;
    }
}
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...