Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Laravel 4


http://romach.ru - другие статьи по теме и работы автора.

 Автор будет благодарен, если вы зайдете, почитаете, прокомментируете и нажмете кнопочку соц.сетей.


Оригинал статьи на сайте: Обзор Laravel 

Примечание: отрывки кода лучше брать с сайта, тут они время от времени странным образом режутся. 


Обзор Laravel

Среди PHP-шников есть особый класс людей, которые категорически не приемлют фреймворки, считая что надо писать своё. Вроде как это и нагрузки на сервер меньше даст, самопис заточен под конкретную задачу, ну или просто лень во всем этом разбираться.

В противовес такой позиции появилась эта статья о фреймворке Laravel. Не буду его сравнивать с другими или рассуждать о том что используя свои велосипеды ты вынужден не только решать задачу, но и поддерживать свои наработки, регулярно допиливая, отлавливая ошибки и прочее. Холивар – гиблое дело, просто “что дает нам Laravel”,  а начнем мы по порядку – с моделей.

Модели

http://laravel.ru/docs/v4/queries

Представьте что у вас есть таблица, скажем книг. Вам нужно в одной из записей поменять автора и для этого вы выполняете запрос вроде такого:

UPDATE books SET author = "Пушкин А.С." WHERE id = 5

И это не считая всяких оберток для работы с БД. Как тоже самое делается в Laravel? Для начала мы создаем модель таблицы:

class Book extends Eloquent
{
}

Собственно всё, уже можно работать. Laravel сам сообразит что модель Book соответствует таблице Books. Теперь изменяем запись:

$row = Book::find(5);
$row->author = 'Пушкин А.С.';
$row->save();

А скажем вот так можно получить все записи:

$rows = Book::all();

Или только книги Александра Сергеевича:

$rows = Book::where('author', 'Пушкин А.С');

Возможности конструктора запросов огромны и в руководстве подробно описаны, что самое приятное – есть и русский перевод.

Объектный подход с конструктором позволяет нам работать с записями не обращая внимания на БД. Мы их изменяем, удаляем, копируем, выбираем, кэшируем, а 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 и отвяжет все остальные тэги. Магия )

Более подробно работа с связями между таблицами опять же описана в руководстве. Вообще, оно довольно неплохо написано по всем аспектам фреймворка, потому в этой статье я лишь пробегусь по самым вкусным моментам.

Модели это конечно хорошо, но данные сами по себе ещё не сайт. Что бы всё ожило, настроим роутинг.

Роутинг

http://laravel.ru/docs/v4/routing

Для этого откроем файл 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. Осталось только его написать.

Шаблоны

http://laravel.ru/docs/v4/templates

Честно говоря, шаблонизатор 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”, т.е. основную часть сайта, а шаблонизатор берет на себя всю работу по сооружению странички из отдельных кусков. Таким образом мы отделяем шаблон от остального кода и избавляемся от повторов одних и тех же кусков в разных местах.

Как и всегда, фишек у шаблонизатора ещё много, подробности в руководстве. А мы перейдем к ещё одной, не менее важной части нормального сайта – валидации.

Валидация

http://laravel.ru/docs/v4/validation

Ещё один момент, позволяющий облегчить нам жизнь при написании сайта. Мы можем проверить что пришедшее к нам значение поля к примеру число, загруженный файл – картинка не превышающая заданный лимит или даже что значение присутствует в определенной таблице.

$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 

В избранное