За последние 24 часа нас посетил 22891 программист и 1222 робота. Сейчас ищут 714 программистов ...

Как ориентироваться в документации на Laravel API?

Тема в разделе "Laravel", создана пользователем xintrea, 11 апр 2019.

  1. xintrea

    xintrea Активный пользователь

    С нами с:
    25 фев 2019
    Сообщения:
    68
    Симпатии:
    0
    Использую Laravel 5.5

    Мне надо посмотреть, например, что возвращает метод Модели create().

    Саму модель я наследую от Illuminate\Database\Eloquent\Model, значит лезу в документацию вот сюда:

    https://laravel.com/api/5.5/Illuminate/Database/Eloquent/Model.html

    И метода create() я там не нахожу.

    Вопрос: где искать описание этого метода?
     
  2. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
  3. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.823
    Симпатии:
    736
    Адрес:
    Татарстан
    ну исходники можно посмотреть?
    а вообще он возвращает созданный экземпляр модели
     
  4. xintrea

    xintrea Активный пользователь

    С нами с:
    25 фев 2019
    Сообщения:
    68
    Симпатии:
    0
    Да обычная модель:
    Код (Text):
    1. namespace App\Models;
    2.  
    3. use Illuminate\Database\Eloquent\Model;
    4.  
    5. class HoldObject extends Model
    6. {
    7.   protected $table = 'hold_objects';
    8.  
    9.   protected $guarded=['id'];
    10. }
    Испльзование:
    Код (Text):
    1. use App\Models\HoldObject;
    2. ...
    3. $holdObject=HoldObject::create( [
    4.   'user' => $userId,
    5.   'hold_object_type' => 1,
    6.   'title' => ''
    7.   ]);
    --- Добавлено ---
    И как по документации на API понять, что описание метода create(), который вызывается у объекта Illuminate\Database\Eloquent\Model надо искать в Illuminate\Database\Eloquent\Builder ?

    По поводу соответствия фасадов и классов я разобрался, в документации есть таблица соответствия:

    Соответствие фасадов и классов в Laravel 5.5


    Но для всего набора классов таких таблиц нет, или я про них не знаю. Откуда брать информацию, что вот этот метод принадлежит вот этому классу?
     
  5. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @xintrea, просто в модели описан магические методы __callStatic() и __call().
    Из __call(), который получает управление из __callStatic(), вызвается метод модели newQuery(), который, в свою очередь и возвращает экземпляр класса Builder (\Illuminate\Database\Eloquent\Builder).
    То есть раз написано в документации, что вызов осуществляется MyModel::create(), а метода create - нет, то вызвается магический метод __callStatic() (поскольку вызов выполняется через оператор разрешения области видимости).
    --- Добавлено ---
    К тому-же модель не должна заботиться о том, кто и как будет записывать её в какую-либо конкретную базу данных...
    Если-б не было этой магии - пришлось бы создавать ручками экземпляр класса билдера и... в общем, чуть больше кода в блоке, оперирующим моделью :)
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    @xintrea, так не секрет, что дока - не самая сильная сторона Laravel. Дока не худшая, но и далеко не лучшая. Я смотрю отладчиком. В раздел API практически не залезаю. В принципе, руководство основные методы использования покрывает полностью.

    Плюс Laravel имеет специфическую архитектуру, понять которую без пол литры иногда очень тяжело. Но удобный он, зараза, тем не менее :)
    --- Добавлено ---
    Т.е. ты со временем просто понимаешь, что половина вызывается через магию, начинаешь читать магические методы и пр.
     
    #6 mkramer, 11 апр 2019
    Последнее редактирование: 11 апр 2019
  7. xintrea

    xintrea Активный пользователь

    С нами с:
    25 фев 2019
    Сообщения:
    68
    Симпатии:
    0
    Ну вот на конкретном примере. Захожу в класс Model, смотрю метод __callStatic():

    Код (Text):
    1.  
    2.   /**
    3.   * Handle dynamic static method calls into the method.
    4.   *
    5.   * @param  string  $method
    6.   * @param  array  $parameters
    7.   * @return mixed
    8.   */
    9.   public static function __callStatic($method, $parameters)
    10.   {
    11.   return (new static)->$method(...$parameters);
    12.   }
    Странная конструкция (new static), видимо имеется в виду self... Может это нужно чтоб создать экземпляр объекта и вызвать у него __call()... Если так, то смотрим его:

    Код (Text):
    1.  
    2.   /**
    3.   * Handle dynamic method calls into the model.
    4.   *
    5.   * @param  string  $method
    6.   * @param  array  $parameters
    7.   * @return mixed
    8.   */
    9.   public function __call($method, $parameters)
    10.   {
    11.   if (in_array($method, ['increment', 'decrement'])) {
    12.   return $this->$method(...$parameters);
    13.   }
    14.  
    15.   return $this->newQuery()->$method(...$parameters);
    16.   }
    Инкремент и декремент - это методы самого класса, и они действительно есть. Теперь надо понять что это за newQuery().

    Код (Text):
    1.  
    2.   /**
    3.   * Get a new query builder for the model's table.
    4.   *
    5.   * @return \Illuminate\Database\Eloquent\Builder
    6.   */
    7.   public function newQuery()
    8.   {
    9.   return $this->registerGlobalScopes($this->newQueryWithoutScopes());
    10.   }
    По самому коду не скажешь, но по комментариям видно, что используется \Illuminate\Database\Eloquent\Builder . То есть на этом можно остановиться, и рассчитывать на то, что в комментариях не ошиблись, и написали правильный возвращаемый тип.

    Так что ли выяснять классы в Larvel?
     
    #7 xintrea, 11 апр 2019
    Последнее редактирование модератором: 11 апр 2019
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    Ну если не получается другим методом, то так. Плюс есть всякие штуки:
    https://github.com/barryvdh/laravel-ide-helper - генерирует doc-блок к моделям, подобные методы вроде тоже указывает.

    В принципе, rкак работает метод create описано здесь: https://laravel.com/docs/master/eloquent#mass-assignment

    Я говорю, дока не очень у Laravel, и исходник без пол литры не разобрать. В принципе, есть ещё фреймворков до фига, если тебе не понравится Laravel. Я уже к его недостаткам привык, достоинств у него тоже много. Такое большое покрытие функционала из коробки я ни у кого больше не видел.

    P.S. блок phpdoc - это не просто комментарий. И зачастую генерится автоматически.
    --- Добавлено ---
    Хочешь простого и понятного исходника - возьми Yii2, там прозрачный исходник почти без магии и шикарная дока, но не такое большое покрытие типичных надобностей, как в Laravel, плюс сильные скачки методологии от одной версии к другой, плюс отход от передовых практик ООП в пользу простоты и скорости.
    --- Добавлено ---
    P.S. new static и new self работают по-разному. https://www.php.net/manual/ru/language.oop5.late-static-bindings.php