PHP-Laravel-Trait方法令牌尚未应用,因为与App \ User上的其他特征方法存在冲突

时间:2018-08-27 08:03:39

标签: php laravel

我正在尝试为现有的Laravel应用程序实现 passwordless 登录流程,该应用程序已实现了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 :(得分:1)

这是因为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;
    }
}
?>