Поэтому я только начинаю с Laravel (используя v5) и Eloquent. Я работаю над запуском некоторых основных API-интерфейсов и замечаю, что многие методы работы не отображаются в подсказке кода PhpStorm
Итак, у меня есть эта модель:
namespace Project\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract; use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract; class User extends Model implements AuthenticatableContract, CanResetPasswordContract { }
И в одном из моих контроллеров я стараюсь
User::query()->orderBy('id', 'desc');
User::query()
создает объект Eloquent Builder
и orderBy()
ведет себя корректно и без ошибок. Тем не менее, PhpStorm не показывает orderBy()
(или take()
, skip()
, и я уверен, что другие) при orderBy()
User::query()->
и дает предупреждения, когда я действительно его использую.
Я использую Laravel IDE Helper, который очень помог принести подсказки кода к фасадам, но не к моделям / строителям.
У кого-нибудь есть решение?
Для будущих гуглеров и, возможно, OP, если вы все еще придерживаетесь Laravel.
Пакет laravel-ide-helper решает эту проблему для вас довольно элегантно, и я считаю, что это относительно новая функция; созданная модель PHPDocs.
Вы можете создать отдельный файл для всех PHPDocs с помощью этой команды:
php artisan ide-helper:models
Сгенерированные метаданные будут выглядеть примерно так для каждого класса:
namespace App { /** * App\Post * * @property integer $id * @property integer $author_id * @property string $title * @property string $text * @property \Carbon\Carbon $created_at * @property \Carbon\Carbon $updated_at * @property-read \User $author * @property-read \Illuminate\Database\Eloquent\Collection|\Comment[] $comments */ class Post {} }
Это вызвало проблемы для меня в PHPStorm, однако, когда программное обеспечение жаловалось на несколько определений классов. К счастью, опция доступна для непосредственного написания файлов модели:
php artisan ide-helper:models -W
Есть еще несколько параметров и настроек, если вам нужно настроить поведение, но это его суть.
Вы можете попробовать подключить плагин Laravel для PhpStorm, и вам нужно специально активировать его в настройках вашего проекта.
Немного поздно, но у меня недавно была такая же проблема, поэтому я подумал, что хочу записать заметку:
Это связано с тем, что Database\Eloquent\Model.php
имеет функцию query()
которая возвращает \Illuminate\Database\Eloquent\Builder
а Eloquent\Builder
имеет строку:
use Illuminate\Database\Query\Builder as QueryBuilder;
Затем он использует методы «magic» __call для вызова функций в Query\Builder
. (ищите метод __call
в Eloquent\Builder
)
См. http://php.net/manual/en/language.oop5.overloading.php#object.call
__call () запускается при вызове недоступных методов в контексте объекта.
Таким образом, действительно, метод, который вы вызываете, недоступен 🙂 Существует не так много, что может сделать IDE.
Есть обходные пути, такие как использование тегов @method, но это недопустимо. Альтернативой является использование @mixin (но это не стандарт). См. https://github.com/laravel/framework/issues/7558
Я думаю, что все это будет разрешено, когда они избавятся от всех магических вызовов в коде Laravel и вместо этого используют «черты» PHP. Посмотреть последнее сообщение здесь. 🙂