Иногда меня просят сравнить "такой-то PHP-фреймворк" с Laravel. Поскольку я использовал только несколько фреймворков, в этой статье я расскажу, что такого прекрасного в Laravel, а вы сравните его с другими PHP-фреймворками, которые знаете. Laravel - очень особенный фреймворк с сильным брендингом, поэтому почти всё особенное в Laravel имеет уникальное название. В статье я коснусь не только кода, но и фреймворка, сообщества и экосистемы. == Composer == Composer - менеджер зависимостей для PHP. Он не предназначен конкретно для Laravel, но Laravel без него не работает. Composer (с Packagist) содержит тысячи PHP-пакетов от сообщества, большинство из которых имеют минимум зависимостей и могут быть просто и без проблем добавлены в ваше приложение. Поэтому вам не нужно изобретать велосипед, а фреймворк не будет мешать вам использовать существующие решения. Composer обрабатывает автозагрузку PHP-классов, используя любую конфигурацию из карты классов, файлов, PSR-0 или PSR-4. Поскольку Composer использует версионность, вы легко можете зафиксировать версии пакетов для вашего приложения. Так вы будете уверены, что везде, где вы разворачиваете своё приложение, будет запускаться одинаковый код. Начать работать с Laravel очень просто, достаточно установить Composer и выполнить: %%(sh) composer create-project laravel/laravel %% == PHP 5.4 == Laravel 5 требует PHP 5.4, а Laravel 4 требует PHP 5.3. И когда я говорю "требует", это значит, что Laravel полностью использует все новые возможности PHP, такие как функции-замыкания, пространства имён, типажи и другие. Laravel отнюдь не является одним из фреймворков для PHP 4, адаптированных для использования классов PHP 5. Он разработан в строгом соответствии с парадигмами ООП, и вы действительно можете использовать новейшие возможности PHP. То, что для Laravel требуется PHP, также означает, что ваш код получит улучшенную производительность новой среды выполнения PHP. == Dotenv == Где вы храните секретную информацию вашего приложения, такую как пароль от БД, логин для email и другие вещи? Laravel 5 использует хорошо известный файл %%(t).env%%, который также используют многие фреймворки для других языков программирования. Это файл, в котором вы определяете пары ключ-значение для любой вашей секретной информации. Например, ваш файл %%(t).env%% может выглядеть так: %% APP_ENV=production DB_HOST=127.0.0.1 DB_DATABASE=laraveldb DB_USERNAME=laravelapp DB_PASSWORD=str0ngP4sw0rd %% И вы можете заполнить ваши файлы настроек вот так: %% 'connections' => array( 'mysql' => array( 'driver' => 'mysql', 'host' => getenv('DB_HOST'), 'database' => getenv('DB_DATABASE'), 'username' => getenv('DB_USERNAME'), 'password' => getenv('DB_PASSWORD'), 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', ), ), %% Вы можете создать этот файл локально и ещё один на вашем рабочем сервере и затем обновлять ваше приложение, не беспокоясь о БД и других важных секретных данных. Загрузка файла %%(t).env%% автоматически обрабатывается Laravel с помощью библиотеки ((GIT:../vlucas/phpdotenv Dotenv)). == PSR-4 == Laravel - первый фреймворк, поддерживающий PSR-4. Прямо из коробки Composer автоматически загрузит все классы из каталога %%(t)app%%, используя стандарт автозагрузки PSR-4. Это значит, что у вас может быть одно пространство имён для вашего приложения, и вы можете структурировать его, как захотите и как посчитаете логичным. Laravel не требует от вас размещения определённых файлов в определённых папках. Это каталог приложения по умолчанию с пространством имён %%(t)App%%: %% app ├── Console │ └── InspireCommand.php ├── Http │ ├── Controllers │ │ ├── Auth │ │ │ ├── AuthController.php │ │ │ └── PasswordController.php │ │ └── HomeController.php │ ├── Middleware │ │ ├── AuthMiddleware.php │ │ ├── BasicAuthMiddleware.php │ │ ├── CsrfMiddleware.php │ │ ├── GuestMiddleware.php │ │ └── MaintenanceMiddleware.php │ └── Requests │ └── Auth │ ├── LoginRequest.php │ └── RegisterRequest.php ├── Providers │ ├── AppServiceProvider.php │ ├── ArtisanServiceProvider.php │ ├── ErrorServiceProvider.php │ ├── EventServiceProvider.php │ ├── LogServiceProvider.php │ └── RouteServiceProvider.php └── User.php %% Как видите, здесь есть некоторые вещи по умолчанию, но вы можете разместить классы там, где захотите, и это делается очень просто. Вы всегда можете изменить пространство имён приложения с помощью команды: %%(sh) php artisan app:name YourNamespace %% Эта команда пройдёт по всем вашим файлам и изменит в них объявление пространства имён. == IoC-контейнер - расширения ядра == Контейнер обратного управления в Laravel - мощный инструмент для управления зависимостями классов. Внедрение зависимостей представляет собой способ снятия жестко закодированных зависимостей класса. Вместо этого зависимости внедряются во время выполнения, обеспечивая большую гибкость, так как реализация зависимостей может быть легко изменена. Вы можете использовать IoC-контейнер в вашем приложении, чтобы сделать всё внедряемым и легко тестируемым с помощью объектов-заглушек. IoC-контейнер может извлекать классы без какой-либо настройки. Например: %% class FooBar { public function __construct(Baz $baz) { $this->baz = $baz; } } %% Как видите, класс %%Baz%% автоматически внедрён в класс %%FooBar%%. На практике это будет использоваться в контроллерах вот так: %% class OrderController extends BaseController { public function __construct(Order $orders) { $this->orders = $orders; } public function getIndex() { $all = $this->orders->all(); return View::make('orders', compact('all')); } } %% В этом примере вы видите, что класс %%Order%% внедрён в %%OrderController%% без какой-либо дополнительной настройки. Но в новом Laravel есть кое-что ещё более замечательное, и называется оно - внедрение методов. Это внедрение зависимостей на основе методов. Например, этот класс может быть ещё проще: %% class OrderController extends BaseController { public function getIndex(Order $orders) { $all = $orders->all(); return View::make('orders', compact('all')); } } %% Вы можете добавить столько зависимостей на основе классов или методов, сколько пожелаете, а IoC-контейнер извлечёт их для вас. Поскольку всё в Laravel внедряемо, вы легко можете подменить что-нибудь в ядре фреймворка. == Запросы форм == В Laravel есть эта восхитительная возможность, которая называется запросами форм. Это проверка запросов для ваших контроллеров. Это не просто проверка данных, а полная обработка запроса. Запросы форм комбинируются с функциональностью внедрения методов, чтобы добавить бесшаблонный способ проверки пользовательского ввода. Например, класс %%RegisterRequest%%: %% 'required|email|unique:users', 'password' => 'required|confirmed|min:8', ]; } public function authorize() { return true; } } %% У этого запроса есть правила для проверки данных и функциональность авторизации, которая определяет, кто может использовать этот запрос. В этом примере это может быть кто угодно, поэтому любой может зарегистрироваться, используя поля **email** и **password**. Чтобы использовать этот запрос, вам надо только намекнуть на объект запроса в вашем контроллере, и вы получите проверку запроса очень простым путём: %% auth = $auth; } public function register(RegisterRequest $request) { // Форма регистрации прошла проверку, создать пользователя... $this->auth->login($user); return redirect('/'); } } %% Вы видите, что в этом контроллере нет какого-либо связующего кода или кода проверки, всё сделано раздельно и чисто. У запросов форм есть функциональность перенаправления для случаев ошибок проверки ввода, сообщений для представлений и т.д. == Eloquent == Eloquent ORM, включённая в Laravel, - наиболее мощная реализация шаблона ActiveRecord в PHP. Кроме обычных CRUD-операций в ней есть мягкое удаление, области запросов, отношения, методы доступа и мутаторы, мутаторы дат, наблюдатели модели и многое другое. И знаете что? Вам даже не нужен Laravel, чтобы её использовать. Вы легко можете добавить слой БД Laravel с Eloquent в ваш PHP-проект, сделанный не на Laravel. Перейдите по ссылке ((GIT:../illuminate/database)), чтобы настроить её в вашем проекте. Не говоря уже о сотнях расширений Eloquent, таких как вложенный набор ((GIT:../etrepat/baum Baum)), ((GIT:../dimsav/laravel-translatable Translatable)), проверка моделей ((http://laravelbook.github.io/ardent/ Ardent)), ((GIT:../heybigname/backup-manager Database Backup Manager)), ((GIT:../jenssegers/laravel-mongodb MongoDB)) и многих других. == Цикл версий == У Laravel очень предсказуемый цикл версий. Через каждые шесть месяцев можно ждать очередной версии. Laravel выходит через один месяц после выхода Symfony. Вы получаете либо версию с новыми функциями, либо версию с совершенно новым номером. Версии с исправлениями ошибок выходят каждые несколько месяцев. Это хорошо, потому что фреймворк разрабатывается очень быстро, и вы можете рассчитывать на получение улучшений безопасности и других улучшений так быстро, как только возможно. На основные версии особенно легко переходить, и у вас, вероятно, не возникнет вопросов при обновлении. Но поскольку Laravel является отличной основой для чего бы то ни было, вы можете даже оставаться на одной версии в течение всего года и обнаружите, что для этой версии по-прежнему выходят исправления и улучшения. == SSH задачи == В Laravel есть простой способ для SSH-подключений к удалённым серверам и запуска команд, что позволяет вам легко создавать задачи, которые работают на удалённых серверах. С помощью небольшой настройки вы сможете запускать ваши задачи вот так: %% SSH::into('production')->run(array( 'cd /var/www', 'git pull origin master', )); %% Или вы можете использовать подключение к другому серверу: %% SSH::into('staging')->run(array( 'cd /var/www', 'git pull origin master', )); %% Вы также можете скачивать файлы: %% SSH::into('staging')->get($remotePath, $localPath); $contents = SSH::into('staging')->getString($remotePath); %% Или загружать: %% SSH::into('staging')->put($localFile, $remotePath); SSH::into('staging')->putString($remotePath, 'Foo'); %% Итак, вы увидели, что вы можете создавать с помощью этого инструмента. Вы можете автоматизировать несколько задач, которые нужны вам для развёртывания или обслуживания вашего сервера, или для чего-то ещё. == Flysystem == Flysystem - восхитительный пакет из ((http://thephpleague.com/ Лиги выдающихся пакетов)) для управления файловыми системами. Это файловая система, использующая коннекторы, с помощью которой вы легко можете взаимодействовать с //local//, //awss3//, //dropbox//, //rackspace// и другими файловыми системами в облаке. Вот так просто: %% // Запись файлов File::put('filename.txt', 'contents'); // Чтение файлов $contents = File::get('filename.txt'); // Проверка существования файла $exists = File::exists('filename.txt'); // Удаление файлов File::delete('filename.txt'); // Создание каталога File::makeDirectory('nested/directory'); // Удаление каталога File::deleteDirectory('path/to/directory'); %% И вы можете использовать этот же API для любой файловой системы, которую хотите использовать. Flysystem поставляется встроенным в Laravel, и вы можете использовать класс %%File%%. == Elixir == Если вы пользовались новейшими технологиями для фронтенда последние несколько лет, то, вероятно, вы использовали препроцессор для ваших файлов CSS и JavaScript. Но если нет, то Laravel об этом позаботится. Вам нужна максимально оптимизированная онлайн-версия вашего приложения. Это значит, что вам надо уменьшать и комбинировать ваши файлы CSS и JavaScript. Вместо использования для этого каких-либо PHP-пакетов Laravel предлагает пакет Elixir для исполнителя задач **NodeJS** Gulp. Поэтому вы можете использовать все те преимущества NodeJS и Gulp, которые вам нравятся. Вы запускаете Gulp-задачу **watch**, и Elixir позаботится обо всём для вас. Если вы используете LESS и CoffeeScript, то ваши настройки могут быть такими: %% var elixir = require('laravel-elixir'); elixir(function(mix) { mix.less() .coffee() .routes() .events() .phpUnit(); }); %% Эта конфигурация скомпилирует ваши файлы less и coffee, а также просканирует маршруты и события в вашем приложении. Ещё она будет запускать юнит-тесты после каждого изменения PHP-файлов. Это так просто настроить. Вам надо только поместить ваши файлы less и coffee в папку **/resources/assets**. Для less - **/resources/assets/less**, а для coffee - **/resources/assets/coffee**. Теперь всё настроено. Далее вы можете ссылаться на созданные файлы в ваших представлениях и создавать файлы позже для рабочего окружения. На самом деле Elixir предоставляет даже больше возможностей, чем показано в примере. == compiled.php == Любой полнофункциональный фреймворк загружается с тысячей файлов и объявлений. По большей части все они обрабатываются автозагрузкой Composer, но для наиболее используемых файлов **Artisan** может создать файл **compiled.php**, который загружается при каждом запросе и объединяет все классы, используемые в вашем приложении. Наиболее используемые файлы и классы компилируются в **один единственный файл**, который значительно уменьшает время загрузки приложения. Если у вас есть файлы, которые требуется загружать при каждом запросе, вы также можете указать, какие файлы компилировать в **compiled.php**. Затем этот файл оптимизируется исполняющей средой PHP, поэтому вы можете избежать снижения производительности при загрузке тысяч файлов в ваше рабочее окружение. == HHVM == Когда вы захотите повысить производительность вашего PHP-кода, вы можете сменить PHP-окружение на высокооптимизированную среду исполнения для PHP от Facebook - HHVM. Laravel - один из первых фреймворков, поддерживающих HHVM, и он проходит 100% юнит-тестов на HHVM. Поэтому вы можете быть уверены, что легко можете переключить ваше приложение с PHP на HHVM и получить ещё больше производительности. ((http://hhvm.com/frameworks/)) == Homestead == Laravel Homestead - официальная упакованная Vagrant-"коробка", предоставляющая вам удивительную среду разработки, не требуя установки PHP, HHVM, веб-сервера и любого другого ПО на вашу локальную машину. Это виртуальная машина с установленным ПО, в которое входят: - Ubuntu 14.04 - PHP 5.6 - HHVM - Nginx - MySQL - Postgres - Node (с Bower, Grunt и Gulp) - Redis - Memcached - Beanstalkd - Laravel Envoy - Fabric + расширение HipChat Вы просто запускаете **vagrant up**, заходите на **locahost:8000** и видите ваше запущенное приложение. Ваш код локально "расшарен" для виртуальной машины, и вам вообще не надо устанавливать всё перечисленное ПО, а нужен только Laravel и ваш редактор кода. Позже, когда вы захотите создать VPS-сервер, вы можете использовать проект ((GIT:../laravel/settler Laravel Settler)) для создания точно такого же сервера, как ваше окружение Homestead. Это просто восхитительно и экономит так много времени, избавляя вас от муторных настроек локального окружения для разработки. == Промежуточное ПО Stack == Laravel использует реализацию Symfony HttpKernel от ((http://stackphp.com/ StackPHP)). Это значит, мы можем добавить наше собственное промежуточное ПО в HTTP-слой! Промежуточное ПО запрашивает обработчики, с помощью которых вы можете добавить функциональность в HTTP-запросы - до, после и даже изменяя запросы и ответы. Например, посмотрим на %%MaintenanceMiddleware%%: %% app = $app; } /** * Обработка входящего запроса. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { if ($this->app->isDownForMaintenance()) { return new Response('Be right back!', 503); } return $next($request); } } %% Вы видите, что функциональность служебной проверки добавлена в каждый запрос внутри метода %%handle%%. Видите эту строку %%$next($request)%%? Это то, как запрос передаётся следующему классу промежуточного ПО и в конце самому фреймворку. Вы можете использовать промежуточное ПО для добавления любой необходимой функциональности в ваш HTTP-слой. По умолчанию в Laravel есть AuthMiddleware, GuestMiddleware, MaintenanceMiddleware, CsrfMiddleware, и вы легко можете добавить ваше собственное промежуточное ПО или использовать одно из доступных ((http://stackphp.com/middlewares/ здесь)), такое как HttpCache, Geoip, CORS, OAuth, Turbolinks и другое. == Cashier == Laravel Cashier обеспечивает выразительный, гибкий интерфейс для услуг биллинговых подписок ((https://stripe.com/ Stripe)). Он обрабатывает почти все шаблонные коды биллинговых подписок, которые вы боитесь написать. В дополнение к основному управлению подписками Cashier может обрабатывать купоны, подмену подписок, "количество" подписок, периоды скидок, и даже генерировать PDF-файлы счетов. Это официальный пакет от разработчиков Laravel, не включённый по умолчанию. Посмотрите, как просто использовать Cashier для подписки пользователя: %% $user = User::find(1); $user->subscription('monthly')->create($creditCardToken); // с купоном $user->subscription('monthly') ->withCoupon('code') ->create($creditCardToken); // конец пробного периода $user->trial_ends_at = Carbon::now()->addDays(14); $user->save(); // Отмена $user->subscription()->cancel(); // Итого $user->subscription('monthly')->resume($creditCardToken); // Проверка статуса if ($user->subscribed()) { // } // На пробном периоде if ($user->onTrial()) { // } // Отменён if ($user->cancelled()) { // } // В период скидок if ($user->onGracePeriod()) { // } // Был когда-либо подписан if ($user->everSubscribed()) { // } // Проверка на каком тарифе пользователь if ($user->onPlan('monthly')) { // } %% Вы можете использовать счета и много других функций Stripe. == Rocketeer == ((http://rocketeer.autopergamene.eu/ Rocketeer)) - быстрый и легко развёртываемый инструмент для современных разработчиков. Он вдохновлён Laravel и может быть использован в Laravel, а также в любом PHP-проекте. Он может развернуть любой проект от маленького HTML/CSS веб-сайта до большого PHP-приложения, или любое приложение на любом языке программирования. С помощью Rocketeer вы легко можете разворачивать последнее, текущее или промежуточное окружение и откатываться к старым версиям при необходимости. После небольшой настройки запустить Rocketeer так же легко, как запустить artisan и одну из этих команд: %% deploy deploy:check Проверка готовности сервера получить приложение deploy:cleanup Удалить старые версии с сервера deploy:current Вывести текущую версию deploy:deploy Развернуть веб-сайт deploy:flush Очистить кэш полномочий Rocketeer deploy:ignite Создать конфигурацию Rocketeer deploy:plugin-config Публиковать конфигурацию плагина deploy:plugin-install Установить плагин deploy:plugin-list Просмотр списка текущих включённых плагинов deploy:rollback Откат к предыдущей версии, или к конкретной deploy:setup Установить удалённый сервер для развёртывания deploy:strategies Просмотр списка доступных вариантов для каждой стратегии deploy:teardown Удалить удалённое приложение и существующий кэш deploy:test Запустить тесты на сервере и вывести результаты deploy:update Обновить удалённый сервер не создавая новую версию %% Здорово использовать такой надёжный и продуманный процесс развёртывания. == Объединяя PHP == Laravel действительно объединяет PHP-сообщество, используя более 23 пакетов от всего PHP-сообщества. Использование "лучших из лучших" PHP-пакетов способствует более тесному взаимодействию Laravel и всего PHP-сообщества. Среди включённых в Laravel пакетов присутствуют: **Dotenv**: PHP-версия оригинального dotenv из Ruby, загружает переменные среды. **Carbon**: внушительная библиотека для работы с датами от Брайана Несбита (Brian Nesbitt). **Predis**: надёжный Redis-клиент, созданный Даниэлем Алесандри (Daniele Alessandri). **Phenstalk**: полнофункциональный PHP-клиент для очереди Beanstalked. **SuperClosure**: написанная Джереми Линдблумом (Jeremy Lindblom), эта мощная библиотека позволяет вам сериализовывать и десериализовывать функции-замыкания в PHP. **Whoops**: выводит красивые страницы ошибок и трассировки стека пока Laravel в режиме разработки. **Monolog**: стандарт де-факто среди PHP-библиотек для ведения логов. **Boris**: действительно отличный PHP REPL, который поддерживает восхитительную консольную команду “tinker”. **PasswordCompat**: обеспечивает защищённое хеширование Bcrypt, которое используется в Laravel по умолчанию. **Symfony HttpFoundation**: абсолютно надёжная HTTP-абстракция. Протестированная и проверенная во многих больших реальных приложениях. **Symfony Routing**: этот пакет обеспечивает компиляцию маршрутов Laravel в регулярные выражения. **Symfony HttpKernel**: содержит HttpKernelInterface, который используется как абстракция нижнего уровня в приложениях Laravel. **Symfony BrowserKit**: отличное функциональное тестирование. **StackPHP**: этот проект описывает структуру для построения многоразового независимого от фреймворков промежуточного ПО на уровне HTTP-слоя. == Laracasts - Джефри Вэй (Jeffery Way) == ((https://laracasts.com/ Laracasts)) - это ресурс не только для Laravel-разработчиков, но и для современных PHP-разработчиков в целом. Он предоставляет более 300 видео для решения любой задачи или реализации практически чего угодно с помощью Laravel. Почти всё, что упомянуто в этой статье, можно узнать на Laracasts. Это изумительный обучающий ресурс, который создал Джефри Вэй. Джефри Вэй! Из Envato! Джефри Вэй - очень уважаемый участник PHP-сообщества и отличный учитель. С Laracasts сообщество Laravel действительно выделяется из экосистемы PHP, так как нет ничего подобного для других PHP-фреймворков. == Liferaft == Создание запросов на GitHub - лучший способ сообщить о проблеме и получить решение. Но что вы делаете, когда не можете объяснить свою проблему? Что если вы сталкиваетесь с этой проблемой только в коде вашего приложения? Liferaft (!!(tl_note) спасательный плот - //прим. пер.//!!) - инструмент с интерфейсом командной строки, устанавливаемый с Composer, который обеспечивает лучший способ содействовать Laravel или сообщать о проблемах. Вы просто запускаете одну из команд Liferaft, и она создаёт приложение Laravel. И вы просто помещаете свой код, который воспроизводит вашу проблему, и запускаете другую команду Liferaft для создания запроса на Github. Например: %%(sh) liferaft new my-bug-fix %% И воспроизводите проблему в этом приложении. Единственное, что от вас требуется, это заполнить файл %%(t)liferaft.md%% описанием вашей проблемы, и вы можете предоставить юнит-тест, показывающий, как это должно работать. И затем: %%(sh) liferaft throw %% Тогда разработчик сможет запустить ваше приложение и увидеть вашу проблему. Это решает множество проблем и занимает намного меньше времени у разработчиков фреймворка на ответ и решение вашей проблемы. Вы можете прочитать больше о Liferaft ((http://laravel.com/docs/master/contributions#creating-liferaft-applications здесь)). == Сообщество == Я упоминаю о сообществе в последнюю очередь, потому что сегодня каждый фреймворк имеет большое и дружное сообщество, и Laravel - не исключение. Люди, поддерживающие и разрабатывающие Laravel-пакеты, очень дружелюбны, и вы легко можете участвовать в создании любого пакета, и ваши правки будут приняты очень скоро. Это способствует расширению сообщества, и вам стоит знать, что Laravel был внесён в список самых популярных PHP-фреймворков в 2013 году, опередив ((http://en.wikipedia.org/wiki/Phalcon_%28framework%29 Phalcon)), ((http://en.wikipedia.org/wiki/Symfony2 Symfony2)) и ((http://en.wikipedia.org/wiki/CodeIgniter CodeIgniter)). А в августе 2014 года Laravel стал самым популярным и просматриваемым PHP-проектом на GitHub. Также я должен упомянуть о ((http://laravel.io/ laravel.io)), которым пользуется множество людей, и где вы можете найти обсуждения, ответы на вопросы, вакансии ( ((https://larajobs.com/)) ) и всё, что вам потребуется. == Заключение == Пользователи Laravel знают, что я могу рассказать намного больше особенных вещей о Laravel, но этого должно быть достаточно. Знайте, что вы всегда можете использовать или участвовать в создании Laravel, или даже использовать отдельные части этого отличного PHP-фреймворка.