PhpStorm не использует атрибут get

Я использую последнюю версию 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 приводит к вызову этой функции. Кроме того, вы устанавливали какие-либо подсказки для модели в шаблоне?

Nico Haase 10.01.2023 20:07

«И использовать в представлении, как это или это:» PhpStorm здесь правильный - нет явного / прямого использования метода getFormattedStartDateAttribut(). Этот метод вызывается под капотом Laravel. И PhpStorm не предоставляет каких-либо специфичных для Laravel функций. Во всяком случае, он предоставляется специальным плагином Laravel (например, Laravel Idea). Поэтому вам лучше связаться с автором плагина, чтобы узнать, что он может сделать, чтобы сообщить PhpStorm, что вызов $event->formatted_start_date на самом деле является косвенным использованием метода getFormattedStartDateAttribute().

LazyOne 10.01.2023 20:08

Хорошо, спасибо за помощь. Я свяжусь с автором плагина.

daugaard47 10.01.2023 20:10

На самом деле я не думаю, что это связано с плагином Laravel Idea. Я отключил его, и данные об использовании все еще отображаются. Думаю, я свяжусь с PhpStorm.

daugaard47 10.01.2023 20:13

"и данные об использовании все еще отображаются" - что вы имеете в виду? «Без использования» — это часть последней функции PhpStorm Code Vision.

Nico Haase 10.01.2023 20:15

«На самом деле я не думаю, что это связано с плагином Laravel Idea. Я отключил его, и данные об использовании все еще отображаются». Конечно. Потому что это основная функциональность PhpStorm. НО связь/ссылка между formatted_start_date и getFormattedStartDateAttribute() должна быть установлена/предоставлена ​​чем-то (плагином???), который ЗНАЕТ, как фреймворк Laravel работает под капотом. И поскольку PhpStorm НЕ предоставляет никаких функций, специфичных для Laravel... он не может этого сделать и правильно пишет "без мудрецов". Период.

LazyOne 10.01.2023 20:16

@NicoHaase Демонстрация использования метода является частью последней версии PhpStroms. Называется «Видение кода для PHP». Я думал, что это могло принадлежать тому плагину Laravel Idea. Поэтому, когда я говорю: «Данные об использовании не отображаются», я имею в виду, что над методом getFormattedStartDateAttribute() должно быть «1 использование», поскольку я использую его в представлении.

daugaard47 10.01.2023 20:19

@LazyOne Тогда почему он показывает обычаи, когда я это делаю? public function isGuest(): bool { return $this->participant_parent_id !== null; } Просмотр кода не работает с атрибутами? Когда я использую {{ $participant->isGuest() }} в представлении, это показывает, что я использую это 3 раза в своем коде.

daugaard47 10.01.2023 20:23

@ daugaard47 Пожалуйста, попробуйте перечитать комментарии, которые написали я и Нико Хаасе - ту часть, откуда берется «справочная» информация. Если IDE НЕ знает, что вызов $event->formatted_start_date на самом деле делает СКРЫТЫЙ вызов getFormattedStartDateAttribute() под капотом, то КАК он должен написать «1 использование»? Это знание должно быть откуда-то, верно?

LazyOne 10.01.2023 20:27

@ daugaard47 Относительно isGuest() -- судя по вашему примеру, здесь использование прямое и явное -- $participant->isGuest().

LazyOne 10.01.2023 20:29

@LazyOne Хорошо, я понимаю, что ты сейчас говоришь. Спасибо вам за помощь.

daugaard47 10.01.2023 20:31
Конечные и Readonly классы в PHP
Конечные и Readonly классы в PHP
В прошлом, когда вы не хотели, чтобы другие классы расширяли определенный класс, вы могли пометить его как final.
Повышение качества Laravel с помощью принципов SOLID: Лучшие практики и примеры
Повышение качества Laravel с помощью принципов SOLID: Лучшие практики и примеры
Когда мы говорим о том, как сделать следующий шаг в качестве разработчика, мы должны понимать, что качество кода всегда является основным фокусом на...
Повышение производительности PHP с помощью генераторов
Повышение производительности PHP с помощью генераторов
PHP - это популярный язык сценариев на стороне сервера, который широко используется для веб-разработки. В PHP генераторы или итераторы являются...
Веб-разработка на PHP: Исчерпывающее руководство!!!
Веб-разработка на PHP: Исчерпывающее руководство!!!
PHP - это популярный язык программирования для веб-разработки, который имеет большое и активное сообщество разработчиков. Одной из причин его...
Зачем и как создавать шину событий в Vuejs 3
Зачем и как создавать шину событий в Vuejs 3
Вы когда-нибудь использовали шину событий в Vue 2 и не знаете, как воссоздать ее в Vue 3?
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
1
11
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Эту проблему очень легко решить, вы можете использовать barryvdh/laravel-ide-helper, а затем запустить php artisan ide:model, который просмотрит модели и создаст блок PHPDoc (вы можете добавить параметры и создать их в том же файле модели или в новом файле, где у вас есть только эти блоки PHPDock), и PHPStorm прочитает этот блок документации и узнает, когда вы вызываете attributeWhatever, какой тип.

Он добавит это в вашем случае:

/**
 * @property string $formattedStartDate
 */

Таким образом, любая IDE, способная понимать блоки PHPDock, поймет, что когда вы делаете $class->formattedStartDate, вы ссылаетесь на этот блок, и он относится к типу string.

НО, никакая IDE (если не использовать плагин, о котором я не знаю) не поймет, что getFormattedStartDateAttribute -> formattedStartDate, так что вы все равно получите no usages за 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(): \Illuminate\Database\Eloquent\Casts\Attribute
{
    return Attribute::get(
        function ($value, $attributes) {
            if (! $attributes['start_date']) {
                return 'TBD';
            } else {
                return $attributes['start_date']->format('M. d, Y');
            }
        }
    );
}

Почему? Поскольку использование getFormattedStartDateAttribute — это старый способ, Laravel 9+ упростил его, читайте об Аксессорах.

Обратите внимание, что getXXXXAttribute и setXXXXAttribute больше нет в документации.

Другие вопросы по теме