
Много лет назад наша фирма нашла довольно крупный проект. Портал по недвижимости. Приложение предполагалось нагруженное, и поэтому возникла задача найти подходящий производительный фреймворк. На тот момент у меня было совсем мало опыта, работал я разве что с 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 и выше |
|
MVC (Model–view–controller) |
Да | Да |
Расширения | Поддерживаются | Поддерживаются |
ORM (объектно-реляционное отображение) |
|
|
Тестирование | Из коробки:
|
|
Отладка |
|
Имхо, консоль довольно скудная, зачастую сложно понять из нее вразумительную причину. Проблему можно решить, например, расширением laravel-debugbar. |
Миграция | Инструмент для миграций (класс Migration) |
|
Безопасность |
Всё из коробки + плагины. Контроль доступа к компонентам тесно интегрирован с RBAC. |
|
Шаблонизаторы, работа с шаблонами |
|
|
Кэширование |
|
|
REST API |
|
|
Локализация приложения | Поддерживается | Поддерживается |
Валидация форм | Поддерживается | Поддерживается |
Скаффолдинг |
|
|
Расширения
Собственно, расширений для обоих фреймворков предостаточно, и они есть практически для всего. Вообще это немаловажная составляющая, т.к. все недостатки можно залепить парочкой-другой расширений. Причём они встанут так, как будто так всегда и было.
Миграции
В обоих системах удобные инструменты для миграций, но в Laravel ещё присутствует возможность добавлять сидеры (seeder) для первоначального заполнения базы данными, что будет удобно как при составлении тестов (тестовых данных), так и наполнении статичных справочников. В Yii для этих целей приходится обходиться миграциями.
Безопасность
На самом деле, я бы удивлён, что в Laravel нет достаточного инструментария контроля доступа из коробки. Но, тем не менее, существует большое количество пакетов расширений со своими реализациями. Отмечу, что в обоих фреймворках есть инструменты для работы с паролями, авторизации/аутентификации, защиты от SQL-инъекций, Cross Site Scripting (XSS), Сross Site Request Forgery (CSRF) и пр.
Валидация форм
В обоих фреймворках валидация, конечно, есть, но реализована она по-разному. В Yii она привязана к классу формы или модели. Это позволяет настроить правила прямо в нём, затем после получения данных и заполнения ActiveRecord проверить их согласно правилам. Если, допустим, у нас есть другая форма, которая меняет часть данных модели, то под неё нужно создать свой класс, либо использовать сценарии валидации. Это удобно до тех пор, пока не потребуется валидировать какие-либо значения прямо в контроллере и писать свой кастомный метод проверки, а не использовать методы из коробки. Здесь приходит очередь гордиться Laravel. У него валидатор существует как отдельный класс-помощник и валидирвать данные можно в любом месте в любое время. К тому же, для удобства и общности проверки форм можно расширить класс Eloquent своими методами.
Заключение
На форумах я часто встречал забавную особенность: те, кто наичнал с Laravel, а потом пытался изучать Yii, говорят, что он совершенно неудобный. И наоборот. Независимо от сравнений и обзоров, с чем работать — каждый выбирает сам.