无法使用Auth :: user()

时间:2018-01-27 14:07:47

标签: php laravel eloquent

我目前正试图在我的用户模型上实现一个简单的方法:



    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;
&#13;
&#13;

作为一个快速背景,我使用Spatie的laravel-permission包来管理角色和权限。

任何人都可以帮我弄清楚为什么我无法访问我的用户模型上的方法吗?

1 个答案:

答案 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();