Всем привет! Похоже, жители «Хабрахабра» всё ещё скептически относятся к красноречивому (eloquent) php-фреймворку Laravel от Taylor Otwell. К сожалению, никто так и не осветил вчерашний выход новой 5-й версии. Постараюсь восполнить этот недостаток. Я не буду рассказывать о том, что это за очередной фреймворк и какие велосипеды стоят в его гараже, а освещу лишь те моменты, которых коснулись изменения. В основном статья будет вольным переводом release notes с официального сайта. Часть понятий и терминов я не стал переводить, чтобы не растерялся смысл.
Помню когда только узнал о Laravel, скинул ссылку на офф. сайт коллеге, чтобы разделить свой восторг, однако спустя пару минут услышал категоричное «слишком много розового». Отныне подобные высказывания не должны иметь место быть. Новый дизайн избавили от большой розовой шапки вверху главной страницы, оставив лишь несколько патриотичных (в контексте фреймворка) заголовков, призывающих к использованию именного данного решения.
Страница документация сохранила прежний вид, однако стала более логична в плане разделения версий. Раньше версия разработки была помечена как dev, сейчас же она называется master, что соответствует названию ветки на github.
Удалена папка app/models. Теперь весь код, касающийся именно вашего приложения хранится в папке app в пространстве имен App (привет psr-4!). Стандартное пространство имен может быть изменено Artisan командой app:name.
Controllers, middleware, и requests (новый тип классов в Laravel 5.0) сгруппированы в папке app/Http, т.к. эти классы относятся к HTTP слою приложения. Вместо единого файла с фильтрами каждый middleware (альтернатива фильтрам, что-то между запросом и переходом к контроллеру) обзавелся собственным классом.
Классы в папке app/Providers пришли на замену файлам в папке app/start. Эти service providers обеспечивают подгрузку классов в приложение, такие как обработка ошибок, логирование, загрузка роутов и пр. Там же, вы можете создавать свои service providers.
Файлы мультиязычности и представлений перемещены в папку resources.
Все основные компоненты Laravel реализуют интерфейсы, которые находятся в illuminate/contracts репозитории. У этого репозитория нет внешних зависимостей. Имея удобный, централизованный набор интерфейсов, вы можете использовать их для decoupling, а внедрение зависимостей послужит отличной альтернативой фасадам.
Документация.
Если ваше приложение состоит исключительно из route-controllers, вы можете использовать новую Artisan команду route:cache чтобы значительно ускорить загрузку схемы роутов. Данную возможность имеет смысл использовать на приложениях со 100 и более маршрутами для увеличения скорости загрузки этой части приложения.
На смену Laravel 4 фильтрам, в Laravel 5 пришли HTTP middleware, а уже знакомые стандартные фильтры авторизации и CSRF защиты переписаны на новый лад. Middleware предоставляют единый, постоянный интерфейс для замены любых видов фильтров, позволяя удобно исследовать и отклонять запрос до того, как он будет отдан на обработку контроллеру.
Документация.
В дополнении к существующему constructor injection, теперь вы можете указывать зависимости (ориг.: type-hint dependencies) в методах контроллера. IoC контейнер автоматически внедрит зависимости, даже, если маршрут содержит иные параметры:
Регистрация, авторизация пользователя, а так же восстановления пароля теперь доступны «из коробки», а соответствующие им представления расположенные в resources/views/auth. В дополнении к этому миграция таблицы «users» поставляется вместе с фреймворком. Включение этих простых ресурсов позволяет быстро разрабатывать прототипы, не тратя время на организацию авторизации. Интерфейсы авторизации доступны по маршрутам auth/login и auth/register. Сервис App\Services\Auth\Registrar отвечает за валидацию и создание пользователей.
Теперь события (ориг.: Events) можно определять в виде классов, вместо строк, например:
Событие может быть отослано (ориг.: dispatched), как и раньше:
Обработчик события получит объект события, вместо списка данных:
Документация.
В дополнении к очередям (ориг.: queue job format), поддерживаемых в Laravel 4, Laravel 5 позволяет представить очередь в виде простых command objects. Эти commands находятся в папке app/Commands. Пример:
Базовый контроллер Laravel использует новый DispatchesCommands признак (ориг.: trait), позволяющий довольно просто отправлять commands на выполнение:
Commands так же можно использовать для задач, которые выполняются синхронно (не выстраиваются в очередь). По факту, использование commands это отличная возможность инкапсулировать сложные задачи, решаемые вашим приложением.
Документация.
Драйвер очередей баз данных теперь доступен из коробки. Предоставляет простой локальный драйвер, не требующий дополнительных зависимостей за пределами БД.
Раньше, чтобы запланировать выполнение какой-то консольной команды, разработчикам приходилось «вешать» каждую из них на cron, что доставляло немало головной боли. Из-за того, что данный процесс не происходит в экосистеме приложения, требовалось подключаться к серверу по SSH (либо через веб-интерфейс) и контроллировать процесс вручную. Теперь все стало намного проще. Планировщик задач в Laravel позволяет быстро и просто добавить задачи на выполнение по расписанию внутри самого приложения и теперь это требует всего одну cron задачу!
Выглядит примерно так:
Документация.
Команда php artisan tinker теперь использует Psysh от Justin Hileman (более надежный REPL для PHP). Если вам нравилось использовать Boris в Laravel 4, то вы непременно полюбите и Psysh. Он даже работает под Windows! Чтобы начать, пропишите в терминале:
Вместо сбивающего с толку разнообразия вложенных папок с конфигурациями окружений, Laravel 5 использует DotEnv от Vance Lucas. Эта библиотека предоставляет супер простой способ управления настроек для конкретной среды выполнения и позволяет определять окружение на лету.
Документация.
Laravel Elixir от Jeffrey Way, предоставляет простой и выразительный интерфейс для сборки ресурсов (ориг.: assets). Если вы боялись начать изучать Grunt или Gulp — теперь это будет легко. Elixir это прослойка для Gulp для сборки Less, Sass, и CoffeeScript, а так же для конкатенации файлов и кеширования на основании версий. Он даже может запускать тесты!
Документация.
Laravel Socialite — необязательный пакет, совместимый с Laravel 5.0+, позволяющий абсолютно безболезненно реализовать авторизацию по протоколу OAuth. На текущий момент поддерживает Facebook, Twitter, Google, and GitHub. Как это выглядит:
Документация.
Теперь Laravel поставляется с мощнейшей файловой системой Flysystem, являющейся уровнем абстракции, предоставляющая безболезненную интеграцию с локальной ФС, Amazon S3, и облачным хранилищем Rackspace — все это в одном едином и элегантном API! Хранить файлы на Amazon S3 теперь так просто:
Документация.
Laravel 5.0 представляет «запросы формы» (ориг. form requests), которые расширяются Illuminate\Foundation\Http\FormRequest классом. Эти объекты запроса могут быть внедрены в методы контроллера для валидации пользовательского ввода. Пример простого FormRequest:
После того, как класс определен мы можем «намекнуть» (ориг.: type-hint) о нем в методе контроллера:
Когда Laravel IoC container определит, что внедряемый экземпляр класса FormRequest, запрос автоматически будет проверен (ориг.: validated). Это означает, что если вызван метод (ориг.: action) контроллера вы можете быть уверены, в том, что пользовательский ввод был успешно проверен в соответствии с определенными в FormRequest правилами. Даже больше, если запрос невалиден, автоматически сработает редирект (который вы можете настроить) куда будет передано быстрое сообщение (ориг.: flash message) в сессию, либо JSON строкой. Валидация форм еще никогда не была такой простой!
Документация.
Базовый контроллер в Laravel 5 теперь может использовать ValidatesRequests признак (ориг.: trait). Этот признак предоставляет простой метод валидации поступающего запроса. Если FormRequests слишком громоздкий для вашего приложения, взгляните на это:
Если валидация не прошла, будет брошено исключение и отправлены соответствующие HTTP заголовки обратно в браузер. Так же, ошибки валидации «вспыхнут» (ориг.: flashed) в сессию. Если запрос был послан AJAX-ом, Laravel автоматически отконвертирует эти ошибки в JSON строку.
Документация.
По случаю обновления структуры фреймворка были добавлены новые Artisan generator commands. Для более детальной информации пропишите в терминале
Теперь можно кешировать все конфигурационные файлы, объединив их в один файл командой:
Популярный хелпер dd, который «вываливает» отладочную информацию, обновлен и теперь использует невероятный Symfony VarDumper, который предоставляет цветной вывод и даже сворачивание\разворачивание массивов. Просто попробуйте это:
По случаю релиза 5ой версии Jeffrey Way открыл бесплатный доступ к видео урокам, в которых доступно объясняет новые возможности. До какого момента — неизвестно. Видео можно посмотреть онлайн, однако кнопка download ведет в личный кабинет, поэтому, если хотите посмотреть позже, то инспектируйте видео плеер в поисках прямой ссылки.
Так же есть серия статей от Matt Stauffer, если любите почитать.
Laravel отличный, свежий фреймворк. Он аккумулирует в себе лучшие практики ООП и существующие компоненты, это конструктор, проектировать на котором легко и приятно.
UPD 1: спасибо dr1v3 за труды
UPD 2: ajaxtelamonid поделился ссылкой на перевод документации 5ой версии
Обновленный дизайна официального сайта
Помню когда только узнал о Laravel, скинул ссылку на офф. сайт коллеге, чтобы разделить свой восторг, однако спустя пару минут услышал категоричное «слишком много розового». Отныне подобные высказывания не должны иметь место быть. Новый дизайн избавили от большой розовой шапки вверху главной страницы, оставив лишь несколько патриотичных (в контексте фреймворка) заголовков, призывающих к использованию именного данного решения.
Страница документация сохранила прежний вид, однако стала более логична в плане разделения версий. Раньше версия разработки была помечена как dev, сейчас же она называется master, что соответствует названию ветки на github.
Файловая структура
Удалена папка app/models. Теперь весь код, касающийся именно вашего приложения хранится в папке app в пространстве имен App (привет psr-4!). Стандартное пространство имен может быть изменено Artisan командой app:name.
Controllers, middleware, и requests (новый тип классов в Laravel 5.0) сгруппированы в папке app/Http, т.к. эти классы относятся к HTTP слою приложения. Вместо единого файла с фильтрами каждый middleware (альтернатива фильтрам, что-то между запросом и переходом к контроллеру) обзавелся собственным классом.
Классы в папке app/Providers пришли на замену файлам в папке app/start. Эти service providers обеспечивают подгрузку классов в приложение, такие как обработка ошибок, логирование, загрузка роутов и пр. Там же, вы можете создавать свои service providers.
Файлы мультиязычности и представлений перемещены в папку resources.
Contracts
Все основные компоненты Laravel реализуют интерфейсы, которые находятся в illuminate/contracts репозитории. У этого репозитория нет внешних зависимостей. Имея удобный, централизованный набор интерфейсов, вы можете использовать их для decoupling, а внедрение зависимостей послужит отличной альтернативой фасадам.
Документация.
Route Cache
Если ваше приложение состоит исключительно из route-controllers, вы можете использовать новую Artisan команду route:cache чтобы значительно ускорить загрузку схемы роутов. Данную возможность имеет смысл использовать на приложениях со 100 и более маршрутами для увеличения скорости загрузки этой части приложения.
Route Middleware
На смену Laravel 4 фильтрам, в Laravel 5 пришли HTTP middleware, а уже знакомые стандартные фильтры авторизации и CSRF защиты переписаны на новый лад. Middleware предоставляют единый, постоянный интерфейс для замены любых видов фильтров, позволяя удобно исследовать и отклонять запрос до того, как он будет отдан на обработку контроллеру.
Документация.
Controller Method Injection
В дополнении к существующему constructor injection, теперь вы можете указывать зависимости (ориг.: type-hint dependencies) в методах контроллера. IoC контейнер автоматически внедрит зависимости, даже, если маршрут содержит иные параметры:
public function createPost(Request $request, PostRepository $posts)
{
//
}
Authentication Scaffolding
Регистрация, авторизация пользователя, а так же восстановления пароля теперь доступны «из коробки», а соответствующие им представления расположенные в resources/views/auth. В дополнении к этому миграция таблицы «users» поставляется вместе с фреймворком. Включение этих простых ресурсов позволяет быстро разрабатывать прототипы, не тратя время на организацию авторизации. Интерфейсы авторизации доступны по маршрутам auth/login и auth/register. Сервис App\Services\Auth\Registrar отвечает за валидацию и создание пользователей.
Event Objects
Теперь события (ориг.: Events) можно определять в виде классов, вместо строк, например:
class PodcastWasPurchased {
public $podcast;
public function __construct(Podcast $podcast)
{
$this->podcast = $podcast;
}
}
Событие может быть отослано (ориг.: dispatched), как и раньше:
Event::fire(new PodcastWasPurchased($podcast));
Обработчик события получит объект события, вместо списка данных:
class ReportPodcastPurchase {
public function handle(PodcastWasPurchased $event)
{
//
}
}
Документация.
Commands / Queueing
В дополнении к очередям (ориг.: queue job format), поддерживаемых в Laravel 4, Laravel 5 позволяет представить очередь в виде простых command objects. Эти commands находятся в папке app/Commands. Пример:
class PurchasePodcast extends Command implements SelfHandling, ShouldBeQueued {
use SerializesModels;
protected $user, $podcast;
/**
* Create a new command instance.
*
* @return void
*/
public function __construct(User $user, Podcast $podcast)
{
$this->user = $user;
$this->podcast = $podcast;
}
/**
* Execute the command.
*
* @return void
*/
public function handle()
{
// Handle the logic to purchase the podcast...
event(new PodcastWasPurchased($this->user, $this->podcast));
}
}
Базовый контроллер Laravel использует новый DispatchesCommands признак (ориг.: trait), позволяющий довольно просто отправлять commands на выполнение:
$this->dispatch(new PurchasePodcastCommand($user, $podcast));
Commands так же можно использовать для задач, которые выполняются синхронно (не выстраиваются в очередь). По факту, использование commands это отличная возможность инкапсулировать сложные задачи, решаемые вашим приложением.
Документация.
Database Queue
Драйвер очередей баз данных теперь доступен из коробки. Предоставляет простой локальный драйвер, не требующий дополнительных зависимостей за пределами БД.
Laravel Scheduler
Раньше, чтобы запланировать выполнение какой-то консольной команды, разработчикам приходилось «вешать» каждую из них на cron, что доставляло немало головной боли. Из-за того, что данный процесс не происходит в экосистеме приложения, требовалось подключаться к серверу по SSH (либо через веб-интерфейс) и контроллировать процесс вручную. Теперь все стало намного проще. Планировщик задач в Laravel позволяет быстро и просто добавить задачи на выполнение по расписанию внутри самого приложения и теперь это требует всего одну cron задачу!
Выглядит примерно так:
$schedule->command('artisan:command')->dailyAt('15:00');
Документация.
Tinker / Psysh
Команда php artisan tinker теперь использует Psysh от Justin Hileman (более надежный REPL для PHP). Если вам нравилось использовать Boris в Laravel 4, то вы непременно полюбите и Psysh. Он даже работает под Windows! Чтобы начать, пропишите в терминале:
php artisan tinker
DotEnv
Вместо сбивающего с толку разнообразия вложенных папок с конфигурациями окружений, Laravel 5 использует DotEnv от Vance Lucas. Эта библиотека предоставляет супер простой способ управления настроек для конкретной среды выполнения и позволяет определять окружение на лету.
Документация.
Laravel Elixir
Laravel Elixir от Jeffrey Way, предоставляет простой и выразительный интерфейс для сборки ресурсов (ориг.: assets). Если вы боялись начать изучать Grunt или Gulp — теперь это будет легко. Elixir это прослойка для Gulp для сборки Less, Sass, и CoffeeScript, а так же для конкатенации файлов и кеширования на основании версий. Он даже может запускать тесты!
Документация.
Laravel Socialite
Laravel Socialite — необязательный пакет, совместимый с Laravel 5.0+, позволяющий абсолютно безболезненно реализовать авторизацию по протоколу OAuth. На текущий момент поддерживает Facebook, Twitter, Google, and GitHub. Как это выглядит:
public function redirectForAuth()
{
return Socialize::with('twitter')->redirect();
}
public function getUserFromProvider()
{
$user = Socialize::with('twitter')->user();
}
Документация.
Flysystem Integration
Теперь Laravel поставляется с мощнейшей файловой системой Flysystem, являющейся уровнем абстракции, предоставляющая безболезненную интеграцию с локальной ФС, Amazon S3, и облачным хранилищем Rackspace — все это в одном едином и элегантном API! Хранить файлы на Amazon S3 теперь так просто:
Storage::put('file.txt', 'contents');
Документация.
Form Requests
Laravel 5.0 представляет «запросы формы» (ориг. form requests), которые расширяются Illuminate\Foundation\Http\FormRequest классом. Эти объекты запроса могут быть внедрены в методы контроллера для валидации пользовательского ввода. Пример простого FormRequest:
<?php namespace App\Http\Requests;
class RegisterRequest extends FormRequest {
public function rules()
{
return [
'email' => 'required|email|unique:users',
'password' => 'required|confirmed|min:8',
];
}
public function authorize()
{
return true;
}
}
После того, как класс определен мы можем «намекнуть» (ориг.: type-hint) о нем в методе контроллера:
public function register(RegisterRequest $request)
{
var_dump($request->input());
}
Когда Laravel IoC container определит, что внедряемый экземпляр класса FormRequest, запрос автоматически будет проверен (ориг.: validated). Это означает, что если вызван метод (ориг.: action) контроллера вы можете быть уверены, в том, что пользовательский ввод был успешно проверен в соответствии с определенными в FormRequest правилами. Даже больше, если запрос невалиден, автоматически сработает редирект (который вы можете настроить) куда будет передано быстрое сообщение (ориг.: flash message) в сессию, либо JSON строкой. Валидация форм еще никогда не была такой простой!
Документация.
Simple Controller Request Validation
Базовый контроллер в Laravel 5 теперь может использовать ValidatesRequests признак (ориг.: trait). Этот признак предоставляет простой метод валидации поступающего запроса. Если FormRequests слишком громоздкий для вашего приложения, взгляните на это:
public function createPost(Request $request)
{
$this->validate($request, [
'title' => 'required|max:255',
'body' => 'required',
]);
}
Если валидация не прошла, будет брошено исключение и отправлены соответствующие HTTP заголовки обратно в браузер. Так же, ошибки валидации «вспыхнут» (ориг.: flashed) в сессию. Если запрос был послан AJAX-ом, Laravel автоматически отконвертирует эти ошибки в JSON строку.
Документация.
New Generators
По случаю обновления структуры фреймворка были добавлены новые Artisan generator commands. Для более детальной информации пропишите в терминале
php artisan list
Configuration Cache
Теперь можно кешировать все конфигурационные файлы, объединив их в один файл командой:
php artisan config:cache
Symfony VarDumper
Популярный хелпер dd, который «вываливает» отладочную информацию, обновлен и теперь использует невероятный Symfony VarDumper, который предоставляет цветной вывод и даже сворачивание\разворачивание массивов. Просто попробуйте это:
dd([1, 2, 3]);
По случаю релиза 5ой версии Jeffrey Way открыл бесплатный доступ к видео урокам, в которых доступно объясняет новые возможности. До какого момента — неизвестно. Видео можно посмотреть онлайн, однако кнопка download ведет в личный кабинет, поэтому, если хотите посмотреть позже, то инспектируйте видео плеер в поисках прямой ссылки.
Так же есть серия статей от Matt Stauffer, если любите почитать.
Laravel отличный, свежий фреймворк. Он аккумулирует в себе лучшие практики ООП и существующие компоненты, это конструктор, проектировать на котором легко и приятно.
UPD 1: спасибо dr1v3 за труды
UPD 2: ajaxtelamonid поделился ссылкой на перевод документации 5ой версии