我正在尝试为现有的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上的其他特征方法存在冲突
答案 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;
}
}
?>