Дождались, релиз 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:
<?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ой версии
Share post
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 31

    +4
    Странно, что выпустили сейчас, мне он кажется сырым: сразу заметна неоднородность наименований классов (часть с неймспейсами, часть без) и очень поверхностная надстройка elixir над gulp, которая без расширения способна выполнять только самые простые задачи.
    Плюс этот elixir сильно повышает планку навыков JavaScript, необходимых для использования фреймворка.
    Попробуйте простой пример: объединение нескольких less, sass и css файлов в один.
      0
      сразу заметна неоднородность наименований классов (часть с неймспейсами, часть без)

      можно пример подобных классов?
        +2
        Например, ./database без неймспейсов. Или ./tests.
        Понятно, что мелочи, но все равно неаккуратно и вводит в заблуждение.
          +2
          Думаю, OnYourLips имел ввиду папку database, где лежат seeds и migrations. Но я бы не стал так категорично сетовать на неоднородность. Если говорить об однородности приложения, то тут все в порядке, а вышеупомянутые классы ничто иное как хелперы и на функциональность приложения никак не влияют и в общем-то не должны знать о приложении в принципе.

          В Laravel 4 действительно была мешанина автозагрузки, но теперь все довольно лаконично:
          "autoload": {
              "classmap": [
                  "database"
              ],
              "psr-4": {
                  "App\\": "app/"
              }
          },
          


          По поводу вашей задачи для эликсира:
          elixir(function(mix) {
              // сохраняем в css ресурсы
              mix.less('app.less', 'resources/css');
          });
          
          elixir(function (mix) {
              mix.styles([        
                  // скомпилированный app.less и чистый page.css
                  "app.css",
                  "page.css"
              ], 'public/css/everything.css');
          });
          // объединенный файл с less и обычными стилями будет лежать тут public/css/everything.css
          

          Добавить к этому примеру sass не составит труда

          UPD: извините, ушел в магазин, когда начал писать ответ. Продолжил, когда вернулся, а вы уже ответили
        0
        Пробежал глазами заголовок, и прочел «Доигрались, релиз Laravel 5».
        Ого, думаю, это ж чем так опасен 5й Laravel?

        Надо больше спать.
          0
          Господа, подскажите годную инструкцию по установке homestead для laravel 5 под windows 7.
            0
            Эмм… В чем затык? Это же vagrant-образ.
              0
              примерная инструкция:
              — ставите virtualbox
              — ставите vagrant
              — пишете vagrant up в папке проекта
              +13
              Уже готов перевод документации: laravel.su/docs/5.0
                0
                Спасибо за ссылку, не знал о вашем ресурсе, думал единственный русскоязычный это laravel.ru
                0
                Кто-нибудь в курсе как в новую версию вписывается разработка собственных пакетов? Раньше можно было мучать workbench. Я верно понял что его «выпилили» и предлагают новые пакеты устанавливать через composer?
                  0
                  Taylor хотел уменьшить связь фреймворка с разрабатываемыми пакетами, поэтому да, прежний workbench «выпилен», а пакеты теперь разрабатываются по структуре, которую придумаете сами, но устанавливаются как и раньше, composer-ом
                    +2
                    С одной стороны, конечно, здорово. С другой — доставляет определённое неудобство.

                    К примеру сейчас я веду работу над двумя пакетами. Одни использует в качестве зависимости второй. Получается что после того как я внёс изменения в пакет, то мне нужно закоммитить эти изменения и выполнить composer update в другом пакете.

                    Можно, конечно, использовать симлинки, но это как-то… неправильно, что ли.
                      0
                      Для разработки лучше использовать не packagist пакеты а локальные репозитории. Как то так надо: coderwall.com/p/znlc-g/develop-symfony2-bundles-without-github-packagist
                        0
                        У меня так и сделано, вроде.

                        {
                            "name": "inikulin/nourriture",
                            "require": {
                                "inikulin/gluten": "*"
                            },
                            "autoload": {
                                "psr-4": {
                                    "Nourriture\\": "src/"
                                }
                            },
                            "repositories": [
                                {
                                   "type": "vcs",
                                   "url": "/Users/inikulin/gluten"
                                }
                             ],
                            "minimum-stability": "dev"
                        }
                        


                        И получается, что бы в проекте inikulin/nourriture получить изменения, которые были сделаны в inikulin/gluten мне нужно сначала закоммитить и только после этого они подтягиваются композером.

                        По ссылке что вы дали автор пишет что можно сделать симлинк на репозиторий. Но этот метод, я так понимаю, в Windows не работает.
                          0
                          Что вам мешает использовать симлинки в виндовс? Если только вы не на Windows XP или ниже.

                          Символическая ссылка (symbolic links) — доступна с Windows Vista. en.wikipedia.org/wiki/NTFS_symbolic_link

                          Но все равно эта все похоже на костыль. Для локальной разработки библиотек надо строить дев окружение, а все остальные участники должны забирать обновления из удаленных репозиториев. Если вам хочется подключать локальные библиотеки, то надо или допилить автолоадер или иметь разные composer.json для вашего локального окружения и для продакшена. Тогда в локальном composer.json можно указать локальные пути библиотек для автолоадера. А в ide их добавить как внешние библиотеки.
                            0
                            Мешает как раз то что это костыль.

                            Кстати, раз вы упомянули разные composer.json в зависимости от окржужения. Есть какой-нибудь рецепт как это организовать? Исключать сам composer.json и вместо него коммитить некий composer.json.dist?
                              0
                              Я бы попробовал сделать трюк с автолоадером, и перезаписывать пути к папкам в локальной версии приложения. Вот как тут stackoverflow.com/questions/28106850/how-to-use-composer-to-load-php-classes-from-local-repository и просто подключать локальный файл с доп правилами если есть. Или пойти глубже и написать плагин (или хук) для композера который будет зависеть от какого нибудь local_composer.json =)
                            0
                            Но этот метод, я так понимаю, в Windows не работает.

                            Если вы используете например Vagrant, то это не проблема.
                          0
                          Буквально на днях на packagist появился пакет, вроде как решающий вашу проблему. Подробно не смотрел, больше сказать не могу
                      0
                      Напрягает немного, что заинтерфейсили почти всё, а Eloquent, QueryBuilder технично обошли стороной.
                        0
                        Тоже заметил, отсутствие возможности внедрять зависимости для моделей немного печалит.
                          0
                          Модель стоит довольно обособленно от всего остального, поэтому и внедрять туда все подряд не было бы лучшим подходом. Вы можете создать репозиторий для модели и внедрять туда что душе будет угодно
                            0
                            Это костыль, и не работает в большинстве случаев (допустим если надо внедрить acl). Если уж собрались поддерживать философию IoC то надо поддерживать, а нет так, на пол шишечки.
                        0
                        Безопасно ли обновляться с 4-ой версии?
                          0
                          В каком плане безопасно? Например, Jeffrey Way перевел Laracasts на 5ую версию за вечер и был весьма рад этому событию :)

                        Only users with full accounts can post comments. Log in, please.