Примечание: отрывки кода лучше брать с сайта, тут они время от времени странным образом режутся.
Обзор Laravel
Среди PHP-шников есть особый класс людей, которые категорически не приемлют фреймворки, считая что надо писать своё. Вроде как это и нагрузки на сервер меньше даст, самопис заточен под конкретную задачу, ну или просто лень во всем этом разбираться.
В противовес такой
позиции появилась эта статья о фреймворке Laravel. Не буду его сравнивать с другими или рассуждать о том что используя свои велосипеды ты вынужден не только решать задачу, но и поддерживать свои наработки, регулярно допиливая, отлавливая ошибки и прочее. Холивар – гиблое дело, просто “что дает нам Laravel”, а начнем мы по порядку – с моделей.
Возможности конструктора запросов огромны и в
руководстве подробно описаны, что самое приятное – есть и русский перевод.
Объектный подход с конструктором позволяет нам работать с записями не обращая внимания на БД. Мы их изменяем, удаляем, копируем, выбираем, кэшируем, а Eloquent (ORM Laravel) сам составляет нужные запросы под конкретную СУБД.
А теперь немного магии ) В качестве примера работы с моделями опишу такую штуку как теги. Нам нужен инструмент позволяющий выбирать/задавать тэги книгам, либо наоборот выбирать все
книги по тэгу – связь многие-ко-многим не самая простая задача для новичка. Что нам понадобится для этого? Создаем две таблицы:
Таблица тэгов tags с полями id и name
Таблица связи книги-тэги с полями book_id и tag_id
Переписываем наш класс Book, добавляя метод описывающий связь многие-ко-многим с моделью тэгов:
class Book extends Eloquent { public function tags() { return $this->belongsToMany('Tag');
} }
и создаем модель тэгов с обратной связью:
class Tag extends Eloquent { public function books() { return $this->belongsToMany('Book'); } }
Всё! Теперь мы можем выбрать все книги с определенным тэгом:
$books = \Tag::where('name', 'Стихотворения')->first() //Выбираем запись, ну или ->find(id) ->books(); //Получаем все книги по этому тэгу.
//Обратно: $Tags =
\Book::find(5)->tags(); //Получаем все теги книги
А что бы связать книги с тэгами мы делаем вот так:
\Book::find(5)->tags()->sync(array(1, 3, 5));
Это привяжет к книге с id=5 теги с id=1,3,5 и отвяжет все остальные тэги. Магия )
Более подробно работа с связями между таблицами опять же описана в руководстве. Вообще, оно довольно неплохо написано по всем аспектам фреймворка, потому в этой статье я лишь пробегусь по самым вкусным моментам.
Модели
это конечно хорошо, но данные сами по себе ещё не сайт. Что бы всё ожило, настроим роутинг.
Для этого откроем файл app/routes.php, удалим там всё и добавим строчку:
Route::controller('/', 'HomeController');
Это привяжет к корню сайта контроллер HomeController. Кстати говоря, корневой путь должен располагаться в самом конце: к примеру если нам нужно на
“/book” подключить BookController то это должно произойти раньше подключения “/”. Иначе роутер просто не доберется до нужного нам места.
Роуты бывает разные, можно подцеплять целые контроллеры, отдельные методы, контроллеры ресурсов реализующих REST, добавлять фильтры (к примеру разом запретить не авторизованным пользователям доступ к определенным местам сайта), разбирать параметры и многое другое.
Контроллеры
Создадим или откроем если он есть файл
app/controllers/HomeController.php и вставим туда этот код:
class HomeController extends BaseController { /* getIndex это как index.php, т.е. путь по умолчанию. * get - это метод вызова, т.е. к примеру переход по ссылке. По аналогии мы можем сделать ещё метод * postIndex, который будет вызваться только через POST-запрос (к примеру через форму) */ public function getIndex() { // Возвращаем шаблон books с переданными ему данными в виде
списка всех книг return View::make('books', array('books' => \Book::all())); } }
Теперь просто зайдя в корень сайта мы вызовем метод getIndex контроллера HomeController, который вернет нам страничку сделанную по шаблону books. Осталось только его написать.
Честно говоря, шаблонизатор Laravel оставляет желать лучшего и не идет ни в какое
сравнение с тем же twig, но в целом свою задачу выполняет и всё необходимое в нем есть. Кстати, есть пакеты для twig и smarty, т.ч. проблем с этим не будет.
Продолжим наш пример, создав файл books.blade.php в папке app/view
@extends('layout') @section('content') <ul> @foreach($books as $book) <li>"{{$book->name}}" {{$book->author}} <small>
foreach($books->tags as $tag) {{$tag}} @endforeach </small </li> @endforeach </ul> @stop
С циклом foreach и вставкой переменных через {{}} думаю всё понятно, остановлюсь подробнее на extends и section. Что это такое?
Это наследование шаблонов, примерно так же как наследуются классы. У нас есть родительский шаблон layout, там подключены нужные css и
js, менюшки, футеры, сайдбары и прочее, а так же объявлена секция “content” (@yeild(‘content’)).
Мы его подключили через @extends и с помощью @section переопределили блок “content”, т.е. основную часть сайта, а шаблонизатор берет на себя всю работу по сооружению странички из отдельных кусков. Таким образом мы отделяем шаблон от остального кода и избавляемся от повторов одних и тех же кусков в разных местах.
Как и всегда, фишек у шаблонизатора ещё
много, подробности в руководстве. А мы перейдем к ещё одной, не менее важной части нормального сайта – валидации.
Ещё один момент, позволяющий облегчить нам жизнь при написании сайта. Мы можем проверить что пришедшее к нам значение поля к примеру число, загруженный файл – картинка не превышающая заданный лимит или даже что значение присутствует в определенной
таблице.
$rules = array( 'age' => 'numeric', // число 'foto' => 'image|max:100' // картинка не более 100кб 'name' => 'exists:users,name' //присутствует в поле name таблицы users ); //Input::all() - данные из $_POST и $_GET $validator = Validator::make(Input::all(), $rules); if ($validator->passes()) { $user->update($validator->getData()); return View::make('profile')->with('message', 'Профиль обновлен!'); } else
{ //Возвращаемся назад с введенными данными формы и сообщениями об ошибках. return Redirect::back()->withInput()->withErrors($validator); }
В Laravel из коробки есть внушительный набор проверок на все случаи жизни, просто берем и пользуемся.
Что ещё?
Много чего: миграции, формы, пагинация, работа с почтой, логирование, очереди, REST, кэширование… Не зря Laravel является одним из самых популярных php-фреймворков и топ1 в гитхабе среди
php-проектов.
В общем, если вы до сих пор не пользовались ни чем подобным, то пора завязывать писать костыли и велосипеды, а если да – присмотритесь и почитайте доки. Лучше тратить своё время на выполнение нужных задач, чем на допиливание инструментов которые уже есть и работают.
Конечно, для сложных проектов Symfony будет правильнее, но в остальных случаях Laravel позволяет делать сайты быстро и без лишних заморочек.
Вот собственно и всё на данный момент. Подробности
смотрите в руководстве, ссылками на которое обильно сдобрена эта статья )
Подумалось мне, что я ведь так толком и не рассказал, как работать с Composer, без которых Laravel просто не заведется (ну, если только через костыли). Попробую в следующем выпуске кратко пробежаться по командной строке Windows, консоли Linux и установке / работе с Git и Composer