От автора: год назад команда разработчиков фреймворка CakePHP объявила о запуске новой альфа-версии CakePHP 3 (новая версия вышла в марте 2015 года). Разработчики фреймворка считают, что выход новой версии станет переломным моментом в истории фреймворка, поэтому вместе с тепленьким, прямо из духовки, релизом альфа-версии, родилась и данная статья, в которой представлен свежий взгляд на CakePHP 3, как на эффективный современный фреймворк в веб-разработке на PHP.
Краткая история
В настоящее время существует огромное количество вариантов, когда речь заходит о веб-разработке на PHP. Со временем PHP окреп, и стало появляться все больше PHP фреймворков, предоставляющих веб-разработчиками широкий выбор возможностей. Но так было далеко не всегда.
Если вернуться назад, в 2005 год, когда PHP 4 все еще являлся стандартом, то никаких PHP фреймворков не было, и объектно-ориентированный подход к разработке на PHP был существенной проблемой. Вот как раз в этот момент и появился CakePHP — самый первый PHP MVC фреймворк. Спустя почти 10 лет с момента первого релиза CakePHP продолжил развиваться, способствуя укреплению позиций PHP-разработчиков на рынке труда.
Насколько популярным является фреймворк CakePHP? Он находится в четверке самых популярных PHP проектов на GitHub, на нем реализовано около 130,000 проектов, его группа в Google, в которой создано 32,000 тем для обсуждений, насчитывает более 18,000 участников. Учитывая то, что 270 разработчиков помогали разрабатывать и улучшать код, а 320 разработчиков помогали в написании документации, можно сделать однозначный вывод о том, что у данного фреймворка есть много сторонников. Широкое распространение и растущая, в настоящее время, популярность CakePHP также хорошо описаны в статье, которую написал Джеймс Уоттс (James Watts), ключевой разработчик и администратор сообщества в организации Cake Software Foundation, с которым я консультировался в процессе написания данной статьи.
С появлением 3ей версии фреймворка можно, почти с полной уверенностью, ожидать, что CakePHP останется одним из лидирующих фреймворков в мире PHP, несмотря на огромное количество других PHP фреймворков.
Что нового появилось в 3ей версии CakePHP?
Данный обзор основан на описании альфа-релиза CakePHP 3.0, в котором описаны новые возможности и улучшения, включающие следующие моменты:
Улучшенная производительность. Третья версия включает в себя улучшения по производительности, связанные с процессом настройки и загрузки фреймворка, процессом маршрутизации, а также с некоторыми моментами по генерации вспомогательных шаблонов.
Улучшенные компоненты и хелперы. Третья версия предоставляет улучшенную поддержку уведомлений («быстрых сообщений») благодаря новым классам FlashHelper и FlashComponent. Плюс, был улучшен класс CookieComponent, упрощающий разделение конфигурации для настройки пространства имен у кук и обработки куки данных.
Улучшенное управление сессиями. Управление сессиями всегда было представлено статическим классом в CakePHP, что вызывало ряд проблем в процессе разработки. С выходом третьей версии вы можете получить доступ к сессии через запрашиваемый объект $this->request->session(). Данное изменение упрощает процесс тестирования и позволяет использовать PHPUnit 4.x.
Улучшенное взаимодействие и единообразие. Теперь каркас приложения и каркасы плагинов будут иметь одинаковую структуру директорий для улучшения согласованности частей фреймворка друг с другом.
Слияние тем и плагинов. Одна из ключевых целей CakePHP 3 заключалась в создании более мощных тем. Работая над поставленной целью, стало понятно, что темам действительно необходимы возможности, имеющиеся у плагинов. Соответственно, теперь любой плагин может быть использован в качестве темы, что, в свою очередь, упрощает процессы сборки и перекомпоновки.
Улучшения ORM. Было проведено несколько изменений API, направленных на улучшение ORM (объектно-реляционное отображение). Самое примечательное, что теперь стало гораздо легче определять глубокие связи для экономии операций. Помимо этого, были изменены несколько соглашений, чтобы сократить время обучения и устранить недопонимание со стороны новичков, только начинающих использовать данный фреймворк.
Кроме того, планируется также включить несколько дополнительных возможностей в бета-релиз третьей версии фреймворка. Самые важные из них:
Улучшение интернационализации и локализации (i18n и L10n)
Замена класса CacheHelper, основанная на языке разметки Edge Side Includes
Новое API для более быстрого и простого создания маршрутизации
Третья версия, действительно, представляет существенное обновление фреймворка CakePHP по сравнению с предыдущими версиями.
Почему CakePHP?
Несмотря на то, что в CakePHP есть много классных возможностей, в данном обзоре мы сфокусируемся лишь на нескольких из них, которые действительно выделяют данный фреймворк на фоне других:
Соглашение важнее конфигурации
ORM (Объектно-реляционное отображение) в CakePHP
Компоненты и хелперы
Соглашение важнее конфигурации
CakePHP всегда был связан с быстрой и последовательной разработкой, и, с этой точки зрения, в CakePHP очень большое внимание уделяется соглашениям. Таким образом, подобно фреймворку Ruby on Rails (который послужил одним из источников для вдохновения), CakePHP твердо придерживается принципа соглашение важнее конфигурации.
Соглашения позволяют разработчику не думать о том, «что будет дальше» в процессе изучения фреймворка CakePHP, поскольку необходимые правила уже созданы и выстроены в правильном порядке по умолчанию. Хотя разработчику и нужно познакомиться со всеми принятыми соглашениями в CakePHP, он сможет в дальнейшем, как только освоится, сконцентрироваться на самой сути разработки, не думая о том, где расположен код и какие еще конфигурационные настройки необходимо произвести.
Соглашения CakePHP резко выделяются на фоне самого PHP, который является достаточно либеральным языком программирования. В результате, CakePHP помогает гарантировать существенное единообразие и согласованность в написании кода и создании структур между многими отдельными разработчиками и даже командами разработчиков. Устанавливая стандартный набор соглашений, CakePHP стремится сделать веб-разработку более единообразной и устойчивой.
Для схемы базы данных, например, CakePHP по умолчанию делает ряд определенных предположений относительно того, как определенные переменные, таблицы и их поля должны быть названы. А именно, CakePHP ожидает, что:
Имена таблиц будут заданы во множественном числе (например, orders)
Имя поля первичного ключа будет id
Имена полей внешних ключей будут основаны на соответствующих именах таблиц с последующим добавлением _id (например, внешний ключ в таблице customers был бы назван customer_id).
В качестве демонстрации давайте рассмотрим простой пример с двумя таблицами (articles и users) из базы данных, использующейся для хранения постов блога. В нашем случае мы скажем, что Articles принадлежит (belongsTo) Users, а Users содержит много (hasMany) Articles. В CakePHP 3.0 данные взаимосвязи определялись бы следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// In ArticlesTable.php: class ArticlesTable extends Table { public function initialize(array $config) { $this->belongsTo('Users'); } } // In UsersTable.php: class UsersTable extends Table { public function initialize(array $config) { $this->hasMany('Articles'); } } |
CakePHP предполагает, что были использованы принятые соглашения, и поэтому в процессе выборки ему уже автоматически известно, какие внешние ключи нужно искать (т.е. user_id в таблице articles).
Однако, здесь важно отметить, что CakePHP 3 действительно позволяет легко переопределить соглашения, принятые по умолчанию. Например, предположим, что наш внешний ключ в таблице users был назван author_id вместо user_id. Учитывая данный момент, нам потребуется сделать всего лишь два небольших изменения в нашем коде, чтобы CakePHP понял, что мы не используем соглашения, принятые по умолчанию:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// In ArticlesTable.php: class ArticlesTable extends Table { public function initialize(array $config) { $this->belongsTo('Users' => ['foreignKey' => 'author_id']); } } // In UsersTable.php: class UsersTable extends Table { public function initialize(array $config) { $this->hasMany('Articles' => ['foreignKey' => 'author_id']); } } |
Таким образом, хотя соглашения, имеющие свои преимущества, и являются неотъемлемой частью CakePHP, их легко можно переопределить при необходимости, как это только что было показано.
В то время как некоторые разработчики предпочитают PHP фреймворки (такие как Yii и Laravel), которые не очень сильно опираются на соглашения, соглашения CakePHP могут действительно быть сильно полезными. Они могут помочь разработчику существенно сократить время разработки, когда приходится улучшать или поддерживать код, написанный сторонним разработчиком, поскольку они оказывают прямое влияние на единообразие и согласованность кода и структуры приложений у многих разработчиков, использующих CakePHP, и во многих проектах.
Объектно-реляционное отображение (ORM) в CakePHP
Объектно-реляционное отображение (ORM) в CakePHP очень сильно выигрывает благодаря использованию соглашений фреймворка. Настраивая схему базы данных согласно стандартам CakePHP, вы можете быстро связать таблицы друг с другом благодаря мощному ORM в CakePHP. Вам редко придется использовать SQL-операторы, поскольку CakePHP, например, сам с легкостью обрабатывает различные виды объединения таблиц (hasManyи даже hasAndBelongsToMany).
Используя преимущества класса ContainableBehavior в CakePHP, вы можете, через ассоциации вашей модели, определить, какие таблицы и поля в вашей базе данных должны быть выбраны с помощью SQL запроса. Благодаря ORM становится легче быстро создавать сложные SQL запросы на нескольких уровнях вложенности.
Между прочим, класс ContainableBehavior является отличным примером того, как CakePHP может упростить и модернизировать процесс веб-разработки на PHP. Он позволяет вам искать и фильтровать данные понятным и единообразным способом, а также может помочь увеличить скорость работы вашего приложения и улучшить его общую производительность. (Это работает путем временного или постоянного изменения связей в ваших моделях, используя встроенные возможности для генерации соответствующих серий вызовов bindModel и unbindModel.)
Проблема с ORM заключается в том, что оно делает использование SQL настолько простым, что если разработчик будет недостаточно внимательным, он или она могут писать неэффективные SQL запросы, даже не подозревая об этом. Я действительно много раз видел плохо написанные приложения на CakePHP, в которых не были упорядочены SQL-запросы. Обычно подобные проблемы всплывают спустя несколько лет с момента деплоя, когда базы данных разрастаются, а плохо написанные запросы становятся ужасно медленными.
Основным моментом здесь является то, что до CakePHP 3, ORM получала бы, по умолчанию, любые связанные таблицы при выполнении запроса. В результате простой запрос «найти все» (“find all”) мог потенциально стать очень перегруженным, т.к. SQL были бы получены все данные из всех связанных таблиц. Начиная с версии 3, такое поведение не является поведением по умолчанию. (А в предыдущих версиях CakePHP такое поведение легко отключить, добавив ublic $recursive = -1; в ваш основной файл AppModel.php.)
В общем, обзор ORM в CakePHP показывает, что оно действительно способно улучшить процесс разработки, и если им правильно пользоваться, то это отличный инструмент для быстрого создания сложных запросов. И критически важно, чтобы разработчики уделили достаточное время пониманию ORM, чтобы их запросы были правильными и оптимизированными (что справедливо для любого языка программирования).
Компоненты и Хелперы: библиотеки CakePHP
Одной из потрясающих возможностей CakePHP являются встроенные библиотеки – Компоненты и Хелперы – которые избавляют разработчиков от выполнения многих скучных, повторяющихся и монотонных задач. В контексте MVC, Компоненты помогают улучшить разработку контроллеров, а Хелперы (вспомогательные классы) — упростить логику и код «вьюшек» (т.е. презентационного уровня приложения).
Например, компонент PaginatorComponent магическим образом автоматически конструирует интерфейс постраничной навигации, исходя из поискового запроса. Добавьте хелпер JsHelper, и у вас неожиданно появится пагинация с использованием технологии AJAX, реализованная с помощью вашего любимого JavaScript фреймворка (по умолчанию это jQuery).
Вот некоторые другие полезные Хелперы:
TimeHelper: значительно упрощает процесс отображения дат и времени, предоставляя набор функций для форматирования и вычисления временных значений.
NumberHelper: предоставляет удобные методы для отображения чисел в различных общепринятых (или собственных) форматах и с разной степенью точности.
TextHelper: помогает в создании ссылок, форматировании URL-адресов, создании отрывков текста вокруг выбранных слов или словосочетаний, подсвечивании ключевых слов в текстовых блоках и изящном обрезании длинных участков текста.
Помимо этого есть еще много других Хелперов.
Критика CakePHP 3
Безусловно, каждый фреймворк имеет свои достоинства и недостатки, и CakePHP тому не исключение. Вот лишь некоторые распространенные примеры критики, направленной на CakePHP (данная критика не является мнением автора):
«Устаревший фреймворк; «раздутый» и медленный» — Данное мнение имеет больше исторический характер, с ограниченной (или вообще без нее) долей правды в настоящее время. Поддержка старых версий PHP (4 и ниже) просто исторически требовала от CakePHP «борьбы» с имеющимися проблемами самого PHP. По мере того, как PHP стал более сформированным и окрепшим языком программирования, а также с выходом новой версии CakePHP, данное мнение уже утратило свою значимость.
«Чересчур строгий и ограниченный» — В то время, как у соглашений CakePHP есть очевидные преимущества, все же находятся разработчики, критикующие CakePHP за это. Чаще всего критики жалуются на то, что соглашения данного фреймворка слишком строгие, но они даже не осознают (или не знают), что данные соглашения могут быть легко переопределены. Устанавливая стандартный набор соглашений, CakePHP стремится сделать процесс разработки единообразным, что, учитывая свободные практики написания кода на PHP, должно рассматриваться только с положительной точки зрения.
«Медленный цикл релизов» — Медленный цикл релизов необязательно должен быть чем-то плохим. Наоборот, слишком быстрый цикл релизов может вызвать еще больше проблем. По сути, одна из причин, почему основные релизы CakePHP занимают много времени, заключается в стремлении обеспечить обратную совместимость с ранними версиями PHP, которые до сих пор широко используются. Более того, данный подход избавляет от необходимости вносить серьезные (и частые) изменения в ваш код, когда выходит очередная новая версия. Также следует отметить, что когда дело касается второстепенных релизов (исправления багов, патчей, незначительных улучшений), которые выходят ежемесячно, то команда разработчиков CakePHP 3 работает как угодно, но только не медленно. Кроме того, ответы на сообщения о багах поступают в течение нескольких часов с момента отправки.
«Решение не из коробки» — В противоположность многим другим современным PHP фреймворкам (таким как Yii, например), позволяющим создавать «веб-приложения прямо из коробки», CakePHP специально одобряет и стремится поддерживать кастомные решения. В этом плане я сам был неоднократно вознагражден за использование данного фреймворка при разработке некоторых крупных и нестандартных веб-сайтов и приложений, опирающихся на использование баз данных.
«Использует массивы данных вместо объектов.» — Это уже не является правдой, начиная с версии 3. В предыдущих версиях любые данные должны были храниться во вложенных массивах (например, $user[‘User’][‘username’]). В CakePHP 3 наконец-то исправлен данный момент, и теперь данные хранятся в виде объектов (например, $user->username).
«Слабая документация» — У данного мнения есть доля правды, т.к. документация CakePHP, кажется, не всегда писалась с расчетом на новичков (важная информация иногда описывается всего в одном или двух предложениях, хотя, по идее, требовалось бы несколько абзацев). Команда разработчиков фреймворка знает об этом и, соответственно, работает над улучшением документации. По сути, домашняя страница документации CakePHP 3 открыто показывает высокий уровень приверженности «качеству, валидности и точности» документации. Поскольку CakePHP является фреймворком, который опирается, поддерживается и развивается сообществом, то на каждой странице документации имеется кнопка “Improve this Doc” («Улучшить документацию»), что позволяет и поощряет пользователей CakePHP внести свой вклад в совершенствование (добавление, удаление и исправление отдельных частей) документации.
Заключение
В целом, почти спустя 10 лет с момента релиза первой версии фреймворка, обзор CakePHP показывает, что данный фреймворк по-прежнему живой, развивающийся и конкурентоспособный фреймворк по сравнению с другими появившимися фреймворками.
CakePHP — это целостное и самодостаточное решение для веб-разработки. База исходного кода является завершенной, а функциональные возможности кажутся безграничными. В общем, CakePHP был создан, чтобы сделать процесс веб-разработки быстрым, что является важным не только для самих разработчиков, но и для заказчиков. Самая большая цена, которую приходится платить в веб-разработке, — это время разработки. И в этом плане CakePHP направлен на то, чтобы существенно сократить это время.
CakePHP поддерживается и развивается сообществом. По мере того, как число его сторонников будет расти, он сможет становится только еще лучше. Вступив в сообщество 7 лет назад и видя, как оно продолжает расти, я просто в предвкушении того, что можно ждать от следующей версии CakePHP. Выход CakePHP 3, а также зрелость PHP и CakePHP, означает, что фреймворк будет становится все лучше и лучше.
Если вы ищете решение для веб-разработки на PHP, предоставляющее много преимуществ, наподобие Ruby on Rails (в плане легкости использования и следования принципу «соглашение важнее конфигурации»), тогда вам точно следует выбрать CakePHP. Обучающее руководство по созданию блога на CakePHP займет у вас всего несколько минут по настройке и запуску, или, в качестве альтернативы, на сайте CakeCoded представлена серия обучающих уроков, которые помогут PHP-разработчику познакомиться с CakePHP и начать его использовать. Благодаря данным ресурсам вы быстро поймете, насколько CakePHP может ускорить и улучшить ваш процесс веб-разработки на PHP. Наслаждайтесь!
Автор: Michael Houghton
Источник: //www.toptal.com/
Редакция: Команда webformyself.
Комментарии (12)