использование возврата $ this внутри метода - PullRequest
0 голосов
/ 18 ноября 2018

Я использую Laravel и Eclipse в качестве своей IDE. Я использую пакет laravel-ide-helper для автозаполнения.

Я вызываю методы из красноречивого объекта модели.

Когда я набираю

User::find

Затмение предоставило мне:

find ($ id, $ columns): \ Illuminate \ Database \ Eloquent \ Model.

, что означает, что метод "find" возвращает экземпляр \ Illuminate \ Database \ Eloquent \ Model.

Однако, когда я набираю

User::where

Затмение предоставило мне следующее:

where($column, $operator, $value, $boolean) : $this

, что означает функцию "где" возвращает

$this

Теперь я не знаю, что означает $, потому что, насколько я понимаю, «где» должен возвращать экземпляр построителя запросов. Насколько я знаю, $ означает объектный метод метода (в данном контексте, саму модель User). Но это явно не возвращает модель. Я подозреваю, что я не понимаю, что $ означает в этом контексте.

Чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Eclipse работает исключительно от комментариев метода в исходном коде для его подсказок, поэтому, если вы посмотрите на исходный код для Builder, который является возвращаемым типом query(), он имеет для find ...

/**
     * Find a model by its primary key.
     *
     * @param  mixed  $id
     * @param  array  $columns
     * @return \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Collection|static[]|static|null
     */
    public function find($id, $columns = ['*'])

для where() это ...

/**
     * Add a basic where clause to the query.
     *
     * @param  string|\Closure  $column
     * @param  string  $operator
     * @param  mixed   $value
     * @param  string  $boolean
     * @return $this
     */
    public function where($column, $operator = null, $value = null, $boolean = 'and')
    {

Поскольку он может добавить только один тип подсказки, он использует первый из find(), который\Illuminate\Database\Eloquent\Model и единственная опция из where() - $this.

0 голосов
/ 18 ноября 2018

Методы find() и where() не существуют в классе Model, поэтому вызовы этих методов заканчиваются переходом к магическому методу PHP __call(), который есть у Laravel определено. Внутри этого магического метода Laravel перенаправляет вызов метода в новый объект построителя запросов, который имеет с этими методами.

Метод класса построителя запросов 'find() возвращает модель, а его метод where() возвращает ссылку на себя ($ this), так что вы можете свободно связывать дополнительные вызовы методов с конструктором.

Все это может затруднить для IDE предоставление подсказок (IntelliSense), в которые входят пакеты, такие как laravel-ide-helper. Они в основном генерируют файлы, полные интерфейсов, которые ваша IDE может использовать, чтобы понять, какие магические методы и свойства существуют для различных классов, но в некоторых случаях эти сигнатуры методов все еще не соответствуют тому, что вы хотели бы знать о структуре кода.

В этом случае предложения IntelliSense, по-видимому, заполняются из блока документов для \Illuminate\Database\Eloquent\Builder::where():

/**
 * Add a basic where clause to the query.
 *
 * @param  string|array|\Closure  $column
 * @param  mixed   $operator
 * @param  mixed   $value
 * @param  string  $boolean
 * @return $this
 */
public function where($column, $operator = null, $value = null, $boolean = 'and');

Вы можете видеть, что тип возвращаемого значения определен как $this. На этом этапе некоторые IDE могут быть достаточно умными, чтобы понять смысл и предоставить предложения для экземпляра этого класса. Однако это может усложниться, если определения методов, которые анализирует ваша IDE, генерируются такими пакетами, как laravel-ide-helper. В этом случае это зависит не только от возможностей вашей IDE, но и от вывода пакета помощника.

...