В чем смысл служебных функций в Laravel - PullRequest
0 голосов
/ 31 августа 2018

Добрый день всем, я новичок в Laravel и с чем я столкнулся и чего не могу понять, это служебные методы, которые используются в каркасе, например, Customer::all(), где Customer - модель, или Customer::find(). Итак, в чем смысл утилитарных методов и почему all() и find() являются статическими.

Ответы [ 5 ]

0 голосов
/ 31 августа 2018

Функции утилит в целом предлагают какую-то утилиту, то есть функциональность, которая обычно предназначена только для удобства, а также может быть достигнута, выполнив ряд шагов.

Например, Model::find() - это функциональность, которая также может быть достигнута путем создания объекта построителя запросов и последующего выполнения запроса, например,

Model::getQuery()->where('id', '=', $id)->first();

Для удобства вы можете просто сделать Model::find($id), который короче и более интуитивно понятен.

Это статично, потому что не имеет смысла не быть статичным. Нестатический метод требует экземпляра класса, однако в ORM экземпляр класса соответствует потенциальной записи в базе данных (которая либо существует, либо может существовать). Поэтому, поскольку find используется для извлечения записи из базы данных, нет смысла требовать наличия резервной записи в базе данных для ее использования.

Короче говоря, это означает, что если вы выполните метод $object = Model::find(1), вы получите модель, соответствующую записи в базе данных с идентификатором 1. Существует соотношение 1: 1 объекта PHP к реляционному объекту. Если внести изменения в $object и вызвать $object->save(), то изменения будут сохранены в базе данных (т.е. $object уже существует). Если, с другой стороны, вы введете $object = new Model(), вы получите новую модель, которая в настоящее время не соответствует записи в базе данных. Однако, вызов $object->save() сделает этот объект соответствующим новой записи в базе данных, и он будет соответствующим образом обновлен (то есть новый объект может существовать). Если фреймворк требовал от вас создания «фиктивного» объекта просто для доступа к некоторым вспомогательным методам, всегда есть вероятность, что (либо из-за пропуска, либо из-за неизвестных побочных эффектов) save() вызовут этот фиктивный объект, и вы в конечном итоге заполните свой База данных с тем, что по сути мусор.

Вывод из этого заключается в том, что в ORM не имеет смысла создавать экземпляр модели, если вы не собираетесь хранить его в базе данных. Laravel не строго соблюдает это правило, но в целом он соблюдается, и вы тоже должны.

То же самое относится к all, который получает все записи базы данных. Не имеет смысла получать все записи базы данных, требуя сначала получить одну запись.

То же самое относится к getQuery, используемому выше, который возвращает экземпляр построителя запросов. Обратите внимание, что большинство людей на самом деле не используют getQuery, потому что оно работает неявно, когда кто-то использует что-то вроде, например. Model::where(..) технически Model::where() тоже утилита. Я упоминаю об этом, потому что когда вы видите что-то вроде Model::where('id', $id)->where('name', $name), 2-й, где находится после ->, что подразумевает, что это экземпляр, а не статический, однако этот экземпляр на самом деле является экземпляром построителя запросов, а не экземпляром модели.

0 голосов
/ 31 августа 2018

Эти методы являются частью системы Eloquent и помогают вам получать записи из вашей базы данных.

Метод all получает всех записей для данной модели из базы данных и возвращает Collection экземпляров этой модели. Если вы сделаете User::all(), коллекция каждого отдельного пользователя в вашей базе данных будет возвращена как Collection из User объектов.

$users = User::all(); // Returns a Collection of User objects
foreach ($users as $user) {
    // Here, each $user will be an instance of User
}

Метод find используется для поиска модели в базе данных по ее первичному ключу. Этот метод фактически возвращает один экземпляр модели, если он находит запись, соответствующую данному первичному ключу, или null, если ничего не находит.

$user = User::find(1); // Find a User with the primary key 1, or null

Эти методы на самом деле не являются статичными, хотя вы можете использовать их, как если бы они были. Метод find является нестатическим методом для объекта Illuminate\Database\Eloquent\Builder, а метод all является вспомогательным методом для Illuminate\Database\Eloquent\Model, который в конечном итоге вызывает метод get объекта Builder.

Когда вы вызываете User::find(1), Laravel создаст новый запрос или объект Builder и вызовет метод find для Builder, который вернет вам новый объект User, или ноль. Аналогично, при вызове User::all() Laravel создаст новый запрос или Builder объект и вызовет метод get(), который вернет вашу коллекцию моделей.

Класс Illuminate\Database\Eloquent\Model использует магический метод __callStatic для перенаправления вызовов статических методов для несуществующих статических методов к объекту Builder. Вот как вы можете вызывать их в статическом контексте:

public static function __callStatic($method, $parameters)
{
    return (new static)->$method(...$parameters);
}

Таким образом, вы можете эффективно сделать это для достижения тех же результатов:

$user = (new User)->find(1);
$allUsers = (new User)->get();
0 голосов
/ 31 августа 2018

all () find () где () и т.д .. эти методы не являются служебными методами, они являются методами orm и происходят из Query Builder.

Они статичны, поэтому они позволяют вам использовать их без создания экземпляра

0 голосов
/ 31 августа 2018

Когда вы делаете User::find(), вы фактически запрашиваете новый экземпляр, либо экземпляр Collection , либо QueryBuilder .

Подсветка \ База данных \ Eloquent \ Модель: https://github.com/laravel/framework/blob/master/src/Illuminate/Database/Eloquent/Model.php

В качестве примечания вы также увидите другой способ использования статических методов в Laravel, например. Input::get(). Они называются Фасады.

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

Когда пользователь ссылается на любой статический метод на ... фасаде, Laravel разрешает привязку кеша из контейнера IoC и запускает запрошенный метод (в данном случае get) для этого объекта.

Подробнее о фасадах Laravel можно узнать по адресу: http://laravel.com/docs/facades

0 голосов
/ 31 августа 2018

Laravel включает в себя множество глобальных «вспомогательных» функций PHP. Многие из эти функции используются самой платформой; тем не менее, вы свободно использовать их в своих собственных приложениях, если вы находите их удобными.

Итак, в основном, помощники в Laravel - это встроенные служебные функции, которые вы можете вызывать из любого места в вашем приложении. Если бы они не были предоставлены базовой платформой, возможно, вы закончили разработку своих собственных вспомогательных классов.

Хотя ядро ​​уже предоставляет множество помощников, всегда есть шанс, что вам понадобится ваш собственный и вы захотите его разработать, чтобы вам не приходилось повторять один и тот же код здесь и там, что обеспечит лучшую поддержку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...