...

пятница, 6 февраля 2015 г.

[Из песочницы] Дождались, релиз Laravel 5

Laravel logo Всем привет! Похоже, жители «Хабрахабра» всё ещё скептически относится к красноречивому (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.


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:

Комментариев нет:

Отправить комментарий