На 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 есть развитая система компонентов и виджетов.
сходства и общие решения
- 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: мифы и легенды
40 лучших инструментов и ресурсов Laravel
статьи по теме
-
ЧитатьКак перейти с Java на Kotlin при создании веб-приложений? Ресурсы для начала изучения и мнения экспертов07.05.2024
-
ЧитатьMediaSoft Java Weekend — 4 доклада с презентациями для Java-разработчиков20.03.2024
-
ЧитатьЛайфхаки при использовании Java29.02.2024
-
ЧитатьБрокеры сообщений — что это, из чего состоят, плюсы и минусы: сравниваем Apache Kafka, Redis и RabbitMQ02.08.2023
-
ЧитатьElasticsearch — как работает система полнотекстового поиска: плюсы и минусы, альтернативы и лайфхаки03.05.2023
-
ЧитатьКлиент-серверное и межсервисное взаимодействие: разбираемся в REST, GraphQL, RPC и WebSocketСтатья на habr.com18.04.2023