Есть множество вещей в Laravel Eloquent ORM, но чтобы начать этот цикл статей, мы начнем с самого начала и рассмотрим, как загружаются и конструируются модели Eloquent. В этом руководстве мы будем использовать для примера такую модель. %% class Post extends Eloquent { $fillable = ['title', 'content']; } %% Такой выбор связан с тем, что пока мы рассматриваем только стандартное поведение Eloquent, перед тем как начнем что-либо модифицировать. Сейчас мы рассмотрим, что происходит при вызове %%new Post(['post.title' => 'First Post', 'content' => 'lorem'])%%. Сначала мы попадаем в %%__construct%%. Первое что мы проверим - это проверяет ли эта модель, была ли она загружена. Для этого она проверяет статическое свойство %%booted%% родительского класса Eloquent по ключу массива, в нашем случае это %%(t)Post%%. Мы впервые сконструировали экземпляр нашей модели %%(t)Post%%, далее нам надо ее загрузить, вызвав метод %%boot%%. Теперь в %%boot%% нам надо сделать несколько небольших хитростей. По существу, %%boot%% проходит через модель %%(t)Post%% и находит все мутаторы, используя регулярные выражения, и сохраняет их в %%themutatorCache%% в Eloquent в массиве с ключом %%(t)Post%%. Затем мы идем дальше и устанавливаем %%booted['Post']%% в %%true%%, поэтому нам не придется делать это снова в следующий раз, когда нам понадобиться экземпляр %%(t)Post%%. Наконец, в самом конструкторе мы только вызываем %%fill%% с атрибутами, передаваемыми конструктору. В %%fill%% мы пройдем по каждому из наших атрибутов и сделаем следующее. Сначала мы проверим, используется ли в атрибуте точечный синтаксис для ключа. Это нужно для того, чтобы удалить все возможные имена таблиц, такие как %%(t)post.title%%, и заменить их на %%(t)title%%. Теперь мы проверим, разрешено ли атрибуту массовое назначение (mass assigment), с помощью вызова %%isFillable%%. В %%isFillable%% мы проверяем несколько разных способов, которыми может быть обработано массовое назначение. Сначала мы смотрим, установлена ли модель как %%unguarded%%, и если это так, то разрешаем назначение. Далее мы проверяем, находится ли атрибут в массиве %%fillable%%, тогда мы разрешаем назначение еще раз. Затем вызывается %%isGuarded%%, который проверяет, находится ли ключ в массиве %%guarded%%, или %%guarded%% содержит знак звездочки %%array('*')%% (который ставится по умолчанию), тогда мы не разрешаем массовое назначение. Наконец, если %%fillable%% пустой, мы возвращаем %%true%%, если ключ не начинается с подчеркивания, которое используется для скрытых атрибутов, как это принято и в Rails. Если находится %%unfillable%%-ключ, то мы проверяем, является ли модель %%totallyGuarded%%. По сути это значит, что если %%fillable%% пустой и %%guarded%% содержит знак %%(t)*%% (по умолчанию), тогда возникает исключение %%MassAssignmentException%%. Это значит, что если вы не измените свойства %%fillable%% или %%guarded%%, то при попытке вызвать %%fill%% будет возникать исключение %%MassAssignmentExceptions%%. Но если мы разрешим заполнение атрибута, то нам надо сделать %%setAttribute%%. Здесь мы проверяем мутаторы в %%mutatorCache%%, о котором говорилось выше. Если есть совпадение, то мы вызываем этот мутатор, который может содержать любую нужную нам логику. Далее мы проверяем, есть ли ключ в массиве %%dates%%. Если так, то мы задаем значение экземпляру %%Carbon%%, который является мощным расширением PHP-объекта Date. В конце мы задаем значение ключу в массиве %%attributes%%. Наконец, мы возвращаем этот экземпляр пользователю, и наша модель Eloquent полностью загружена. //Примечание: конструктор никак не затрагивает отношения, базу данных или изменение данных.//