Использую Laravel 5.5 Мне надо посмотреть, например, что возвращает метод Модели create(). Саму модель я наследую от Illuminate\Database\Eloquent\Model, значит лезу в документацию вот сюда: https://laravel.com/api/5.5/Illuminate/Database/Eloquent/Model.html И метода create() я там не нахожу. Вопрос: где искать описание этого метода?
Да обычная модель: Код (Text): namespace App\Models; use Illuminate\Database\Eloquent\Model; class HoldObject extends Model { protected $table = 'hold_objects'; protected $guarded=['id']; } Испльзование: Код (Text): use App\Models\HoldObject; ... $holdObject=HoldObject::create( [ 'user' => $userId, 'hold_object_type' => 1, 'title' => '' ]); --- Добавлено --- И как по документации на API понять, что описание метода create(), который вызывается у объекта Illuminate\Database\Eloquent\Model надо искать в Illuminate\Database\Eloquent\Builder ? По поводу соответствия фасадов и классов я разобрался, в документации есть таблица соответствия: Соответствие фасадов и классов в Laravel 5.5 Но для всего набора классов таких таблиц нет, или я про них не знаю. Откуда брать информацию, что вот этот метод принадлежит вот этому классу?
@xintrea, просто в модели описан магические методы __callStatic() и __call(). Из __call(), который получает управление из __callStatic(), вызвается метод модели newQuery(), который, в свою очередь и возвращает экземпляр класса Builder (\Illuminate\Database\Eloquent\Builder). То есть раз написано в документации, что вызов осуществляется MyModel::create(), а метода create - нет, то вызвается магический метод __callStatic() (поскольку вызов выполняется через оператор разрешения области видимости). --- Добавлено --- К тому-же модель не должна заботиться о том, кто и как будет записывать её в какую-либо конкретную базу данных... Если-б не было этой магии - пришлось бы создавать ручками экземпляр класса билдера и... в общем, чуть больше кода в блоке, оперирующим моделью
@xintrea, так не секрет, что дока - не самая сильная сторона Laravel. Дока не худшая, но и далеко не лучшая. Я смотрю отладчиком. В раздел API практически не залезаю. В принципе, руководство основные методы использования покрывает полностью. Плюс Laravel имеет специфическую архитектуру, понять которую без пол литры иногда очень тяжело. Но удобный он, зараза, тем не менее --- Добавлено --- Т.е. ты со временем просто понимаешь, что половина вызывается через магию, начинаешь читать магические методы и пр.
Ну вот на конкретном примере. Захожу в класс Model, смотрю метод __callStatic(): Код (Text): /** * Handle dynamic static method calls into the method. * * @param string $method * @param array $parameters * @return mixed */ public static function __callStatic($method, $parameters) { return (new static)->$method(...$parameters); } Странная конструкция (new static), видимо имеется в виду self... Может это нужно чтоб создать экземпляр объекта и вызвать у него __call()... Если так, то смотрим его: Код (Text): /** * Handle dynamic method calls into the model. * * @param string $method * @param array $parameters * @return mixed */ public function __call($method, $parameters) { if (in_array($method, ['increment', 'decrement'])) { return $this->$method(...$parameters); } return $this->newQuery()->$method(...$parameters); } Инкремент и декремент - это методы самого класса, и они действительно есть. Теперь надо понять что это за newQuery(). Код (Text): /** * Get a new query builder for the model's table. * * @return \Illuminate\Database\Eloquent\Builder */ public function newQuery() { return $this->registerGlobalScopes($this->newQueryWithoutScopes()); } По самому коду не скажешь, но по комментариям видно, что используется \Illuminate\Database\Eloquent\Builder . То есть на этом можно остановиться, и рассчитывать на то, что в комментариях не ошиблись, и написали правильный возвращаемый тип. Так что ли выяснять классы в Larvel?
Ну если не получается другим методом, то так. Плюс есть всякие штуки: 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