You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 10+Larastan级别9下如何解决User::$full_name未定义属性报错?

解决Larastan报错“Access to an undefined property App\Models\User::$full_name”

针对你用Laravel 10 + Larastan Level 9遇到的这个报错,即便已经给User模型添加了PHPDoc @property 注释,还是出现问题,大概率是以下几个原因之一,对应解决方法如下:

1. 动态属性(Accessor)的PHPDoc标记错误

如果full_name是通过Laravel的**访问器(Accessor)**生成的动态属性(比如拼接first_name和last_name),你应该用@property-read而不是@property标记:

use Illuminate\Foundation\Auth\User as Authenticatable;

/**
 * @property uuid $id
 * @property-read string $full_name // 这里用@property-read
 */
class User extends Authenticatable
{
    // 示例访问器
    public function getFullNameAttribute(): string
    {
        return $this->first_name . ' ' . $this->last_name;
    }
}

Larastan对动态只读属性的识别依赖@property-read标记,用普通@property会被识别为数据库表中存在的字段,若表中实际没有该字段就会触发报错。

2. Auth::user()的类型推断不明确

Larastan在Level 9的严格模式下,可能无法准确推断Auth::user()的返回类型(默认是Authenticatable|null,而非你的User|null)。可以显式指定变量类型来解决:

/** @var \App\Models\User|null $user */
$user = Auth::user();
$model->created_by = $user ? $user->full_name : '?';

或者在项目的phpstan.neon配置文件中,给Auth facade添加类型绑定:

parameters:
    typeAliases:
        Illuminate\Contracts\Auth\Authenticatable: App\Models\User

3. PHPDoc注释的格式或位置错误

  • 确保/** ... */格式的DocBlock直接紧跟在class User定义上方,中间没有被空行或其他代码隔开;
  • 检查注释语法:@property后面的类型和属性名之间要有空格,类型要符合Larastan的识别规则(比如uuid可以改成string,因为Laravel中uuid实际存储为字符串,部分版本的Larastan对uuid类型识别可能有问题)。

4. Larastan缓存导致的旧规则残留

运行以下命令清除Larastan的结果缓存,确保它加载最新的模型注释:

./vendor/bin/phpstan clear-result-cache
php artisan code:clear

内容的提问来源于stack exchange,提问作者Dom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 15:40:16