我目前正试图在我的用户模型上实现一个简单的方法:
public function becomeAMerchant()
{
return $this->assignRole('merchant');
}

但是,每当我在MerchantController上调用Auth :: user()(或auth() - > user())时,我都无法访问此方法(或者User模型上的任何方法)。
具体而言,PHPStorm告诉我:
Method 'becomeAMerchant' not found on Illuminate\Contracts\Auth\Authenticatable|null

这是我的完整用户模型:
<?php
namespace App\Models;
use Illuminate\Notifications\Notifiable;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;
class User extends Authenticatable
{
use Notifiable, SoftDeletes, HasRoles;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
public function itineraries()
{
return $this->hasMany(Itinerary::class);
}
public function becomeAMerchant()
{
return $this->assignRole('merchant');
}
public function isMerchant()
{
return $this->hasRole('merchant');
}
}
&#13;
作为一个快速背景,我使用Spatie的laravel-permission包来管理角色和权限。
任何人都可以帮我弄清楚为什么我无法访问我的用户模型上的方法吗?
答案 0 :(得分:0)
这是因为Auth::user()
会返回Authenticatable
:这很可能是您的User
型号,但不能保证 - 所以PHPStorm会警告您。它也可能返回null,例如,当没有用户通过身份验证时。
因此,在访问特定于User
模型的任何方法之前,您应该检查手头的对象类型。
$user = Auth::user();
if ($user !== null && $user instanceof App\Models\User) {
$user->becomeAMerchant();
}
或者:
$user = Auth::user();
if ($user !== null && method_exists($user, 'becomeAMerchant')) {
$user->becomeAMerchant();
}
最后 - 如果你100%确定对象的类型是什么,你可以告诉PHPStorm如下:
/** @var App\Models\User $user */
$user = Auth::user();