В прошлой статье я мельком коснулся создание класса модели. Теперь перейдем к более практической части.В нашем простом примере эта часть тоже больше теоретическая.
Модель нужна в парадигме MVC для получения/изменения данных. Они могут находиться в массивах, таблицах базы или в файлах, что совершенно не важно. Laravel, как почти каждый фреймворк на php, предлагает механизм работы именно с базами данных MySQL, PostgressSLQ, SQLite 3. Наиболее часто используют первый и последний вариант. Мы уже настраивали фреймворк на работу с MySQL. Так что и будем с ней продолжать работать.
Идеология разработки в Laravel предполагает, что в моделях делается только получение и изменение в данных. Все проверки и бизнес-логика находится в контроллерах. Впрочем, вы можете часть проверок вынести и в модели – тут полная свобода действий.
Класс Eloquent
Модели в Laravel наследуются от класса Eloquent, который вынесен в отдельный пакет, устанавливаемый по умолчанию. При желании, в другой фреймворк можно его подключить так же (я встречал статьи о подключении его к микрофреймворкам Slim, Silex и к новому фреймоворку Lumen).
Класс Eloquent имеет уже готовые методы для работы с данными: получить, изменить, удалить и так далее. Так же в нем можно задать отношения между таблицами «один-к многим» и «многие – ко многим». Ну и для полного контроля над sql-запросами есть свой SQL-Builder, повторяющий во многом язык запросов sql.
Обо всем этом прекрасно описано в документации на официальном сайте на английском и на русскоязычных сайтах с переводом, правда, похуже. Поэтому я не буду задерживаться здесь.
Как правило, возможностей функций Eloquent достаточно для получения и изменения данных как душе угодно и надобности в специальных методов класса нет.
/* Примеры обращение к модели: */ $posts = Post::all(); // Получить все записи в массив $user = User::find(1); // Получить запись по первичному ключу id $model = User::where('votes', '>', 100)->firstOrFail(); //Получить запись где поле votes больше 100, //если не найдена генерируется исключение и можно вывести ошибку 404 $user->delete(); // Удаление записи User::destroy(1); // Удаление записи в таблице по ключу
Интересно, но даже проверки, выборки данных в видеоуроках делают в контроллерах, что не совсем правильно с точки зрения концепции MVC.
Защита данных
Для защиты данных в Laravel есть интересный механизм, закрывающий доступ к некоторым полям в таблицах.
Если вы не укажите явно доступные поля, то запись в таблицу не пройдет. И правильно – некоторые данные вы не должны трогать «руками», о них заботится сам Laravel. Это id записи, даты создания, даты изменения и так далее. Поэтому нужно прежде всего разрешить изменять записи:
protected $fillable = ['title', 'slug', 'menu', 'description', 'keywords', 'image', 'staus', 'body' ];
Поскольку статические страницы не имеют особых «технических» полей, нет связей с другими таблицами, поэтому почти все поля попадают в эту таблицу.
Можно проверку на разрешенные поля отключить, но не стоит это делать.
Есть массив protected $guarded
, который обратный массиву $fillable
— он наоборот запрещает писать в поля.
Проверка данных
Перед записью в таблицу данных от пользователя нужно их обязательно проверить. Для этого есть специальный класс валидации. В моделях обычно располагают массив, где описывают правильные значения каждого поля. Когда вы получаете от пользователя данные из формы, каждое поле сравнивается с правилами. Если все нормально, то происходит действие. Иначе будут выводиться ошибки валидации, которые можно обработать и показать пользователю.
Опять же, часто в видеоуроках этот массив пишут в контроллере и затем делают валидацию данных. По моему мнению, так не стоит делать, потому что вы можете обращаться к модели из нескольких контроллеров и вам придется дублировать массив.
Вот правила валидации для модели Post:
public static $rules = ['title' => 'required|between:3,255', 'slug' => 'required', 'description' => 'required|between:3,255', 'keywords' => 'required|between:3,255', 'image' => 'required', 'body' => 'required', 'status' => 'required' ];
По валидации будет отдельная статья, сейчас на ней не буду задерживаться подробно.
Заключение
Смешно, но в реальных проектах в моделях кроме этих двух массивов обычно почти ничего нет! Из-за удачного класса Eloquent все делается автоматом.
Сложности начинаются позже при сложной структуре базы данных и сложных правил обработки. Но мы пишем визитку и разбираем класс статических страниц (самый простой), а потому нам будет достаточно такой простой модели.
Ну а сам проект подходит к следующей интересной точке – контроллерам. Но это уже тема другой статьи ?
когда следующая статья ? =(
Скоро. Мой напарник на работе попал в больницу с аппендицитом и я просто зашиваюсь. Сегодня он вышел на работу, как разгребусь — продолжу статьи.
Автор, я надеюсь продолжение будет в ближайшее время?
Тоже жду продолжения. Интересно потом на вот этом https://github.com/jean179/vizitka-laravel можно будет дальше тренироваться?
Хорошо пишите. Все статьи за один раз прочитал;) Надеюсь скоро будут новые статьи.
Как всегда в апреле все и закончилось:( Очень жаль…
Увы, реально нет времени на свое хобби — кроме работы, еще одна подработка на все лето и на всю осень. Домой прихожу только спать, так что на компьютере только почту читаю ?
Приложение создает экземпляр контроллера и запускает метод действия, в котором, к примеру, содержаться вызовы модели, считывающие информацию из базы данных.