- PVSM.RU - https://www.pvsm.ru -

Дождались, релиз Laravel 5

Laravel logo Всем привет! Похоже, жители «Хабрахабра» всё ещё скептически относится к красноречивому (eloquent) php-фреймворку Laravel [1] от Taylor Otwell [2]. К сожалению, никто так и не осветил вчерашний выход новой 5-й версии. Постараюсь восполнить этот недостаток. Я не буду рассказывать о том, что это за очередной фреймворк и какие велосипеды стоят в его гараже, а освещу лишь те моменты, которых коснулись изменения. В основном статья будет вольным переводом release notes [3] с официального сайта. Часть понятий и терминов я не стал переводить, чтобы не растерялся смысл.

Обновленный дизайна официального сайта

Помню когда только узнал о Laravel, скинул ссылку на офф. сайт коллеге, чтобы разделить свой восторг, однако спустя пару минут услышал категоричное «слишком много розового». Отныне подобные высказывания не должны иметь место быть. Новый дизайн [4] избавили от большой розовой шапки вверху главной страницы, оставив лишь несколько патриотичных (в контексте фреймворка) заголовков, призывающих к использованию именного данного решения.

Страница документация сохранила прежний вид, однако стала более логична в плане разделения версий. Раньше версия разработки была помечена как dev, сейчас же она называется master, что соответствует названию ветки на github [5].

Файловая структура

Удалена папка 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, а внедрение зависимостей послужит отличной альтернативой фасадам.

Документация [6].

Route Cache

Если ваше приложение состоит исключительно из route-controllers, вы можете использовать новую Artisan команду route:cache чтобы значительно ускорить загрузку схемы роутов. Данную возможность имеет смысл использовать на приложениях со 100 и более маршрутами для увеличения скорости загрузки этой части приложения.

Route Middleware

На смену Laravel 4 фильтрам, в Laravel 5 пришли HTTP middleware, а уже знакомые стандартные фильтры авторизации и CSRF защиты переписаны на новый лад. Middleware предоставляют единый, постоянный интерфейс для замены любых видов фильтров, позволяя удобно исследовать и отклонять запрос до того, как он будет отдан на обработку контроллеру.

Документация [7].

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. Сервис AppServicesAuthRegistrar отвечает за валидацию и создание пользователей.

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)
    {
        //
    }

}

Документация [8].

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 это отличная возможность инкапсулировать сложные задачи, решаемые вашим приложением.

Документация [9].

Database Queue

Драйвер очередей баз данных теперь доступен из коробки. Предоставляет простой локальный драйвер, не требующий дополнительных зависимостей за пределами БД.

Laravel Scheduler

Раньше, чтобы запланировать выполнение какой-то консольной команды, разработчикам приходилось «вешать» каждую из них на cron, что доставляло немало головной боли. Из-за того, что данный процесс не происходит в экосистеме приложения, требовалось подключаться к серверу по SSH (либо через веб-интерфейс) и контроллировать процесс вручную. Теперь все стало намного проще. Планировщик задач в Laravel позволяет быстро и просто добавить задачи на выполнение по расписанию внутри самого приложения и теперь это требует всего одну cron задачу!

Выглядит примерно так:

$schedule->command('artisan:command')->dailyAt('15:00');

Документация [10].

Tinker / Psysh

Команда php artisan tinker теперь использует Psysh от Justin Hileman (более надежный REPL для PHP). Если вам нравилось использовать Boris в Laravel 4, то вы непременно полюбите и Psysh. Он даже работает под Windows! Чтобы начать, пропишите в терминале:

php artisan tinker

DotEnv

Вместо сбивающего с толку разнообразия вложенных папок с конфигурациями окружений, Laravel 5 использует DotEnv [11] от Vance Lucas. Эта библиотека предоставляет супер простой способ управления настроек для конкретной среды выполнения и позволяет определять окружение на лету.

Документация [12].

Laravel Elixir

Laravel Elixir от Jeffrey Way, предоставляет простой и выразительный интерфейс для сборки ресурсов (ориг.: assets). Если вы боялись начать изучать Grunt или Gulp — теперь это будет легко. Elixir это прослойка для Gulp для сборки Less, Sass, и CoffeeScript, а так же для конкатенации файлов и кеширования на основании версий. Он даже может запускать тесты!

Документация [13].

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();
}

Документация [14].

Flysystem Integration

Теперь Laravel поставляется с мощнейшей файловой системой Flysystem [15], являющейся уровнем абстракции, предоставляющая безболезненную интеграцию с локальной ФС, Amazon S3, и облачным хранилищем Rackspace — все это в одном едином и элегантном API! Хранить файлы на Amazon S3 теперь так просто:

Storage::put('file.txt', 'contents');

Документация [16].

Form Requests

Laravel 5.0 представляет «запросы формы» (ориг. form requests), которые расширяются IlluminateFoundationHttpFormRequest классом. Эти объекты запроса могут быть внедрены в методы контроллера для валидации пользовательского ввода. Пример простого FormRequest:

<?php namespace AppHttpRequests;

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 строкой. Валидация форм еще никогда не была такой простой!

Документация [17].

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 строку.

Документация [18].

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 [19] открыл бесплатный доступ [20] к видео урокам, в которых доступно объясняет новые возможности. До какого момента — неизвестно. Видео можно посмотреть онлайн, однако кнопка download ведет в личный кабинет, поэтому, если хотите посмотреть позже, то инспектируйте видео плеер в поисках прямой ссылки.

Так же есть серия статей [21] от Matt Stauffer [22], если любите почитать.

Laravel отличный, свежий фреймворк. Он аккумулирует в себе лучшие практики ООП и существующие компоненты, это конструктор, проектировать на котором легко и приятно.

Автор: likerRr

Источник [23]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/framework/81890

Ссылки в тексте:

[1] Laravel: http://laravel

[2] Taylor Otwell: https://twitter.com/taylorotwell

[3] release notes: http://laravel.com/docs/5.0/releases#laravel-5.0

[4] Новый дизайн: http://laravel.com

[5] github: https://github.com/laravel/laravel

[6] Документация: http://laravel.com/docs/5.0/contracts

[7] Документация: http://laravel.com/docs/5.0/middleware

[8] Документация: http://laravel.com/docs/5.0/events

[9] Документация: http://laravel.com/docs/5.0/bus

[10] Документация: http://laravel.com/docs/5.0/artisan#scheduling-artisan-commands

[11] DotEnv: https://github.com/vlucas/phpdotenv

[12] Документация: http://laravel.com/docs/5.0/configuration#environment-configuration

[13] Документация: http://laravel.com/docs/5.0/elixir

[14] Документация: http://laravel.com/docs/5.0/authentication#social-authentication

[15] Flysystem: https://github.com/thephpleague/flysystem

[16] Документация: http://laravel.com/docs/5.0/filesystem

[17] Документация: http://laravel.com/docs/5.0/validation#form-request-validation

[18] Документация: http://laravel.com/docs/5.0/validation#controller-validation

[19] Jeffrey Way: https://twitter.com/jeffrey_way

[20] бесплатный доступ: https://laracasts.com/series/laravel-5-fundamentals

[21] серия статей: http://mattstauffer.co/blog/laravel-5.0-form-requests

[22] Matt Stauffer: https://twitter.com/stauffermatt

[23] Источник: http://habrahabr.ru/post/249911/