Symfony, Laravel или Yii2: какой фреймворк изучать PHP-разработчику

На PHP каждую минуту создаются новые сайты, приложения и различные программы. Для ускорения их создания разработчики используют фреймворки. В PHP-среде их довольно много: Laravel, CodeIgniter, CakePHP, Kohana, Yii2, Symfony, Zend 2, Phalcon.

Самыми популярными считаются Laravel, Symfony и Yii2. В чём особенности, сходства и общие решения – рассказали наши разработчики.



 

 

 


По архитектуре и принципам работы они довольно похожи — это все MVC (Model View Controller) фреймворки: Model – отображение записи из базы данных в виде объекта; View – шаблон для рендера HTML или генерации JSON; Controller – логический блок интерпретации действий пользователя.

Если вы владеете навыками ООП PHP, вам будет проще понимать то, что описано выше. Но, если только начинаете знакомиться с этим, самое время прокачать свои знания.

Что такое Symfony?

Один из старейших фреймворков, вдохновленный фреймворком Spring (его даже в шутку называют Spring.php), а Doctrine (библиотека работы с БД) явно вдохновлена Hybernate. Является самым быстрым фреймворком эпохи PHP7+. Symfony – набор компонентов, которые можно использовать отдельно. Разрабатывается с 2005 года, актуальная версия – 6.

Официальная документация Symfony

Что такое Laravel?

Довольно зрелый фреймворк, некоторые технические идеи заимствованы из Ruby on Rails –  архитектура (MVC), структуры файлов и папок в проекте, подход в написании миграций, также стремится к максимально простым решениям для разработчика. 8 февраля 2022 года вышла 9 версия, сам фреймворк разрабатывается с 2011 года. Главная особенность внутреннего устройства состоит в том, что используется достаточно много компонентов Symfony. 

Официальная документация Laravel

Что такое Yii2?

Популярный в русскоязычной среде фреймворк. Изначально разрабатывался китайским разработчиком, косвенно вдохновлен фреймворком ASP.NET – история Yii началась 1 января 2008 года как проект по исправлению некоторых изъянов во фреймворке PRADO. Он был попыткой перенести ASP.NET на платформу PHP. Более простой в изучении в сравнении с другими фреймворками. Больше ориентирован на генерацию HTML и работу с формами. Поэтому в Yii2 есть развитая система компонентов и виджетов.

Официальная документация Yii2

сходства и общие решения

  • Model (Модель) – хранит в себе запись из соответствующей таблицы в БД;
  • Migrations (Миграции) – позволяют вносить изменения в структуру базы данных: создавать таблицы, добавлять и изменять колонки и т.д.;
  • Query Builder (Построитель запросов) – позволяет строить запрос к БД в близком к ООП стиле;
  • Router (Роутер) – преобразовывает путь в URL в вызов конкретного обработчика;
  • Collections (Коллекции) –  ООП-обертки над массивами и функциями работы с массивами;
  • CLI (Консоль) и Commands (Консольные команды) – API для автоматизации рутинных операций;
  • Dependency Injection (Внедрение зависимостей) – возможность автоматической передачи необходимой зависимости компоненту системы.
  • Relations (Отношения) – позволяют оперировать отношениями между сущностями на уровне структуры БД и запросов;
  • Validators (Валидаторы) –  проверяют входные данные на корректность;
  • Request/Response (Запросы и Ответы) –  собственные классы-обертки над всей входящей информацией (это большой плюс, потому что в PHP разные части запроса оказываются в разных переменных внутри языка);

различия фреймворков

Несмотря на большое количество сходств, у компонентов фреймворков есть много различий.

 

/* Если вы читаете с телефона, то для правильного отображения таблицы сделайте ориентацию горизонтальной */

  Laravel Symfony Yii2
Model Модель реализована как ActiveRecord, то есть сама может управлять своим состоянием, запрашивать связанные сущности, сама себя обновлять и сохранять с помощью соответствующих методов Модель реализована как DataMapper, то есть хранит только состояние и является просто отображением соответствующей строки в БД, для всех операций над моделью используется репозиторий Реализована как ActiveRecord, но DSL (Domain Specific Language) в некоторых местах отличается от аналогичного в Laravel
Migrations Свой DSL для написания миграций, явно заимствованный из Ruby on Rails Автоматически генерируются на основе изменений в модели, но пишутся чаще всего на чистом SQL, что немного повышает входные требования к программисту Свой DSL для написания миграций, похожий на тот, что используется в Laravel, но построенный на использовании массивов
QueryBuilder Удобный богатый синтаксис, поддерживает даже экзотические операции (например, JSON-query для PostgreSQL), есть возможность писать запросы в чистом SQL На первый взгляд может показаться сложным, потому что в Doctrine используется свой DSL называемый Doctrine Query Language (DQL), который похож на SQL, но оперирует не таблицами и колонками, а моделями и их полями. Синтаксис сильно ограничен стандартными для большинства БД конструкциями, это принципиальная позиция команды разработки, для всего нестандартного/специфического предлагается писать свои DQL-функции. Все запросы пишутся только в рамках репозитория для модели, но есть набор готовых операций вроде создания/обновления/удаления записи ООП-синтаксис по встроенным возможностям сопоставим с таковым в Symfony, есть возможность писать запросы в чистом SQL
Router Довольно удобный синтаксис указания путей, есть возможность группировки путей для создания дерева URL-ов, имеется удобный DSL для описания самих путей Чаще всего используются аннотации для контроллеров и их методов Не самый удобный способ описания путей, все максимально завязано на массивы
Collection На наш взгляд, лучшая реализация коллекций среди всех трех фреймворков: это и количество операций, и сам синтаксис Два вида коллекций с очень бедным функционалом, чаще приходится работать с массивами «вручную» – через встроенные функции PHP Есть ArrayHelper, который немного упрощает работу с массивами
CLI (Command Line Interface) Большое количество встроенных команд: управление кэшем приложения, генерация практически любой сущности от миграции до JSON-ресурса, удобное API для написания своих консольных команд Похож на Laravel, потому что внутри CLI Laravel спрятан компонент Simfony Console Component Консольный пакет Gii, способный генерировать любую сущность в рамках приложения, есть возможность писать свои команды, а также все это можно сделать прямо в админ-панели приложения нажатием нескольких кнопок
Dependency Injection В основном автоматический, достаточно указать в аргументе метода, экземпляр какого класса ожидается, и нужный объект будет подставлен, также можно настроить вручную Самая навороченная и разнообразная система внедрения зависимостей среди всех PHP фреймворков: внедрение по имени класса, по имени интерфейса, внедрение разных реализаций интерфейса на основе имени аргумента Стандартный для всех современных фреймворков контейнер внедрения зависимостей (аналогично Laravel и Symfony), в простом варианте поддерживает тот же функционал, что и DI в других фреймворках, более сложное поведение настраивается на уровне кода
Validator Не самая удобная реализация валидатора, особенно в DSL, который используется для описания полей и их вложенности, но валидатор работает – это главное Есть валидация на уровне модели, на уровне запроса, сериализация в промежуточное представление –  возможности очень широки Yii предоставляет встроенный набор часто используемых валидаторов, расположенных, в первую очередь, в пространстве имен yii\validators. Вместо того чтобы использовать длинные имена классов валидаторов, вы можете использовать псевдонимы, чтобы указать на использование этих валидаторов
Resource Служит исключительно для генерации JSON-ответа на основе полученных данных

Используется Serializer —

служит для преобразования входного JSON в модель и для генерации JSON на основе итоговых данных, обычно идет в комплекте с валидатором

Стандартная PHP функция json_encode
Facades

Своеобразное решение автора фреймворка, которое часто критикуют – как написано в документации, это «статический прокси» для некоторых классов

Подход facades не используется, происходит регистрация класса в Service container и вызывается по псевдониму на выходе тот же самый Singleton

Подход facades не используется, происходит регистрация класса в Service container и вызывается по псевдониму на выходе тот же самый Singleton

итоги

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

Laravel наиболее популярный PHP-фреймворк, подходит для реализации проектов различной сложности от MVP до высоконагруженных приложений. Имеет наибольшую библиотеку расширений или пакетов, за счет которых можно расширить стандартную функциональность фреймворка. Достаточно удобный в использовании, но иногда его фасады могут ломать понимание кода.

Symfony подходит для реализации крупных проектов с длительным сроком поддержки. Построен на базе компонентов, которые достаточно активно используются в различных приложениях и даже в других PHP-фреймворках. Имеет достаточно жесткие стандарты разработки. Большой порог вхождения, сам по себе он строгий и сложный для начинающих.

Yii2 подходит для реализации проектов различной сложности. Упрощает разработку приложений с высокой масштабируемостью. В данном фреймворке есть достаточно мощная система кодогенерации, за счет которой можно ускорить процесс реализации CRUD-функционала. Использует свой собственный загрузчик классов, в отличие от Laravel и Symfony, которые опираются на Composer Autoloader. На текущий момент потерял свою былую популярность и начинать новые проекты на нем не стоит.

больше источников

Создаем свой фреймворк для разработки приложений

Symfony Framework — полное руководство для начинающих

Что мы знаем о Symfony: мифы и легенды

Учебник Laravel 9

40 лучших инструментов и ресурсов Laravel

Уроки Yii2 с нуля

Что такое Yii2 фреймворк?