Сравнение PHP фреймворков: Yii и Laravel

Много лет назад наша фирма нашла довольно крупный проект. Портал по недвижимости. Приложение предполагалось нагруженное, и поэтому возникла задача найти подходящий производительный фреймворк. На тот момент у меня было совсем мало опыта, работал я разве что с CMS. Но для этого проекта CMS нам не подходила — планировалось много нестандартных компонентов. К тому же, работать с CMS мне совершенно не нравилось по причине сумбурности кода в них. При необходимости в исходниках было очень сложно разобраться. Я занялся исследованием вопроса, прочитал множество сравнительных статей, обзоров, отзывов о передовых на тот момент фреймворках в Интернете. В результате выбрал Yii. Решающим фактором стала отличная документированность, куча обсуждений на форумах, популярность и, как следствие — низкий порог вхождения.

Как сейчас помню, особых сложностей у меня не возникало и решение практически любой проблемы можно было «нагуглить». Конечно, мой код не был идеальным. Я реализовывал некоторые вещи довольно топорно и некрасиво, но дело было лишь в нехватке опыта разработки в целом, и в частности, опыта работы с фреймворком. Я просто не знал, что есть возможность более элегантной и правильной реализации.

Теперь, много лет спустя, на одном из новых проектов я познакомился с завоёвывающим всё большую популярность фреймворком Laravel. Скажу сразу: разрабатывать было неудобно, но я знал — это неизбежно при изучении чего-то нового. Отмечу, что при всей лаконичности документации, мне не хватало более детального описания мелочей, из-за этого нередко приходилось лезть в исходники. А так как Laravel отличается от Yii большим количеством абстракций, то исполняемые методы найти было не так-то просто. В целом, Laravel мне показался похожим на Yii в плане использования, просто методы реализации отличаются и поэтому нужно с ними разбираться. Что-то было сделано более удобно, что-то —  наоборот, вызывало приступы неисчерпаемого гнева. С этого и начнём наше небольшое сравнение.

Описание

Первое впечатление складывается под влиянием описания на главной странице официального сайта. Посмотрим, что могут предложить и чем могут похвастаться фреймворки (на момент написания статьи):

Yii 2

Yii — высокопроизводительный PHP фреймворк для быстрой разработки современных web приложений. Его возможности позволяют реализовывать крупномасштабные проекты типа форумов, порталов, CMS, RESTful web сервисов и пр.

  • Как и у большинства фреймворков, в основе Yii — MVC паттерн (Модель-Представление-Контроллер).
  • Философия Yii — простой, но элегантный код.
  • Yii — это full-stack фреймворк, предоставляющий множество проверенных и готовых к использованию решений: построитель запросов, ActiveRecord для реляционных и NoSQL баз данных, RESTful API, многоуровневую поддержку кэширования и много чего ещё.
  • Yii легко расширяем. Вы можете дополнить или переопределить любой кусок базового кода. Также можно писать и собственные расширения.
  • Высокая производительность — основная цель Yii.

Laravel

Laravel — это фреймворк для web приложений с выразительным и элегантным синтаксисом. Он позволит упростить решение основных наболевших задач, таких как аутентификация, маршрутизация, сессии и кэширование. Laravel — это попытка  объединить всё самое лучшее, что есть в других PHP фреймворках, а также Ruby on Rails, ASP.NET MVC и Sinatra.

Laravel — доступный, но мощный. Располагает множеством отличных инструментов для крупных, надёжных приложений:

  • Превосходная IoC (Инверсия управления).
  • Удобная система миграций.
  • Интегрированная система модульного тестирования.

Это всё красивые слова, но если сравнить по пунктам — у каждого из фреймворков выявляются и сильные, и слабые стороны. Вообще, сравнивать их — это то же самое, что сравнивать NetBeans IDE и PhpStorm IDE: каждый обладает обширными возможностями, и все они реализованы по-своему. Пока не попробуешь, не поймешь, что лучше для тебя и что больше тебе подходит.

Yii vs Laravel

Чтобы сравнить два инструмента, нужно сравнить предлагаемую каждым из них реализацию популярных возможностей, необходимых для быстрой и качественной разработки. Я постарался выделить основные аспекты:

Параметр сравнения Yii Laravel
Требования PHP 5.4 и выше
  • PHP 5.4 и выше
  • MCrypt PHP extension
  • PHP JSON extension
MVC
(Model–view–controller)
Да Да
Расширения Поддерживаются Поддерживаются
ORM
(объектно-реляционное отображение)
  • Data Access Objects (DAO)
  • Active Record Pattern (ActiveRecord)
  • Doctrine 2 через плагины
  • DAO
  • ActiveRecord Pattern (Eloquent ORM)
  • Doctrine 2 через плагины
Тестирование Из коробки:
  • PHPUnit
  • Codeception
  • PHPUnit из коробки
  • Компоненты Symfony для тестирования (HttpKernel, DomCrawler и BrowserKit)
Отладка
  • Подробный консоль отладки из коробки
  • Логирование разных уровней
  • Логирование запросов к БД
  • Логирование
  • Консоль отладки из коробки со стеком вызовов

Имхо, консоль довольно скудная, зачастую сложно понять из нее вразумительную причину. Проблему можно решить, например, расширением laravel-debugbar.

Миграция Инструмент для миграций (класс Migration)
  • Миграции (класс Migration)
  • Инструмент наполнения данными (класс Seeder)
Безопасность
  • Богатый правилами Access Control Filter (ACF)
  • Role Based Access Control (RBAC) на основе NIST RBAC model
  • Расширения для авторизации по OpenID, OAuth или OAuth2 и пр.

Всё из коробки + плагины. Контроль доступа к компонентам тесно интегрирован с RBAC.

  • RBAC
  • ACL плагины
  • Фильтры (по сути функции) контроля доступа
Шаблонизаторы, работа с шаблонами
  • Официальные Twig и Smarty пакеты
  • Asset’ы для подключения JS, CSS и пр.
  • Плагины
  • На базе PHP
  • Blade
  • Asset’ы для подключения JS, CSS и пр.
  • Плагины
  • Все шаблоны по умолчанию кэшируются
Кэширование
  • APC
  • Database
  • File
  • Memcached
  • Redis
  • WinCache
  • XCache
  • Zend Data Cache
  • APC
  • Database
  • File
  • Memcached (в 5 версии)
  • Redis (в 5 версии)
REST API
  • Поддержка JSON, JSONP и XML из коробки
  • Роутинг в соответствии с REST-запросами
  • Поддержка HATEOAS
  • Кэширование запросов
  • Ограничение скорости и пр.
  • Настройка роутинга REST-запросов
  • Поддержка JSON, JSONP и пр.
Локализация приложения Поддерживается Поддерживается
Валидация форм Поддерживается Поддерживается
Скаффолдинг
  • Gii (Yii Code Generator) — интерфейс для генерации моделей, CRUD, контроллеров, форм, модулей, расширений
  • Консоль
  • В консоли через Artisan
  • Расширения

Расширения

Собственно, расширений для обоих фреймворков предостаточно, и они есть практически для всего. Вообще это немаловажная составляющая, т.к. все недостатки можно залепить парочкой-другой расширений. Причём они встанут так, как будто так всегда и было.

Миграции

В обоих системах удобные инструменты для миграций, но в Laravel ещё присутствует возможность добавлять сидеры (seeder) для первоначального заполнения базы данными, что будет удобно как при составлении тестов (тестовых данных), так и наполнении статичных справочников. В Yii для этих целей приходится обходиться миграциями.

Безопасность

На самом деле, я бы удивлён, что в Laravel нет достаточного инструментария контроля доступа из коробки. Но, тем не менее, существует большое количество пакетов расширений со своими реализациями. Отмечу, что в обоих фреймворках есть инструменты для работы с паролями, авторизации/аутентификации, защиты от SQL-инъекций, Cross Site Scripting (XSS), Сross Site Request Forgery (CSRF) и пр.

Валидация форм

В обоих фреймворках валидация, конечно, есть, но реализована она по-разному. В Yii она привязана к классу формы или модели. Это позволяет настроить правила прямо в нём, затем после получения данных и заполнения ActiveRecord проверить их согласно правилам. Если, допустим, у нас есть другая форма, которая меняет часть данных модели, то под неё нужно создать свой класс, либо использовать сценарии валидации. Это удобно до тех пор, пока не потребуется валидировать какие-либо значения прямо в контроллере и писать свой кастомный метод проверки, а не использовать методы из коробки. Здесь приходит очередь гордиться Laravel. У него валидатор существует как отдельный класс-помощник и валидирвать данные можно в любом месте в любое время. К тому же, для удобства и общности проверки форм можно расширить класс Eloquent своими методами.

Заключение

На форумах я часто встречал забавную особенность: те, кто наичнал с Laravel, а потом пытался изучать Yii, говорят, что он совершенно неудобный. И наоборот. Независимо от сравнений и обзоров, с чем работать — каждый выбирает сам.