【问题标题】:PhpStorm No Usages for get AttributePhpStorm 没有使用获取属性
【发布时间】:2023-01-11 03:46:28
【问题描述】:

我使用的是最新版本的 PhpStorm (2022.3.1) 和 Laravel 9+。这不是一个大问题,而是一个主要的问题。

出于某种原因,当我使用模型创建这样的自定义属性时:

    public function getFormattedStartDateAttribute(): string
    {
        if (!$this->start_date) {
            return 'TBD';
        } else {
            return $this->start_date->format('M. d, Y');
        }
    }

并在这样或这样的视图中使用:

  • 日期{{ $event->formattedStartDate }}
  • 日期{{ $event->formatted_start_date }}

PhpStorm 仍然说该方法有 no usages

图片:

有没有办法来解决这个问题?我试过重新索引我的项目。这是一项名为Code Vision 的新功能。

【问题讨论】:

  • 听起来你应该在那个插件的问题跟踪器中打开一个问题。 PhpStorm 本身不知道 Blade 模板中的任何事件都会导致调用该函数。另外,您是否在模板中为模型设置了任何类型提示?
  • “并在这样或这样的视图中使用:”PhpStorm 在这里是正确的——没有明确/直接getFormattedStartDateAttribut() 方法的用法。这个方法被 Laravel 在底层调用。并且 PhpStorm 不提供任何 Laravel 特定的功能。如果有的话,它是由 Laravel 特定插件(如 Laravel Idea)提供的。所以你最好联系插件作者,他可以做些什么让 PhpStorm 知道调用 $event->formatted_start_date 实际上是间接使用 getFormattedStartDateAttribute() 方法。
  • 好的,谢谢你的帮助。我会联系插件的作者。
  • 其实我不认为它来自 Laravel Idea 插件。我禁用了它,但使用数据仍在显示。我想我会联系 PhpStorm。
  • “并且使用数据仍在显示” - 你是什么意思? “No usages”是 PhpStorm 最新功能 Code Vision 的一部分

标签: laravel phpstorm


【解决方案1】:

这个问题很容易解决,您可以使用barryvdh/laravel-ide-helper,然后运行php artisan ide:model,这将遍历模型并创建一个 PHPDoc 块(您可以添加选项并在同一模型文件或新文件中创建它们你只有这个 PHPDock 块),PHPStorm 将读取这个文档块并知道你何时调用 attributeWhatever 是什么类型。

它将在您的情况下添加:

/**
 * @property string $formattedStartDate
 */

这样,任何能够理解 PHPDock 块的 IDE 都会理解,当您执行 $class->formattedStartDate 时,您指的是那个块,它的类型为 string

但是,没有 IDE(除非使用我不知道的插件)会理解 getFormattedStartDateAttribute -> formattedStartDate,所以你仍然会得到 no usages for getFormattedStartDateAttribute,但至少你可以跟踪 formattedStartDate并用它做任何你想做的事。


一个快速提示,如果您使用的是 Laravel 9+,请更改该代码:

public function getFormattedStartDateAttribute(): string
{
    if (!$this->start_date) {
        return 'TBD';
    } else {
        return $this->start_date->format('M. d, Y');
    }
}

到:

public function formattedStartDate(): IlluminateDatabaseEloquentCastsAttribute
{
    return Attribute::get(
        function ($value, $attributes) {
            if (! $attributes['start_date']) {
                return 'TBD';
            } else {
                return $attributes['start_date']->format('M. d, Y');
            }
        }
    );
}

为什么?因为使用 getFormattedStartDateAttribute 是旧方法,Laravel 9+ 使它更容易,阅读 Accessors

看到 getXXXXAttributesetXXXXAttribute 甚至不再出现在文档中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 2015-07-13
    • 2016-06-16
    相关资源
    最近更新 更多