Мой обзор CakePHP 3 — еще свежий, еще горячий
Опубликовано: 2022-03-11В прошлом месяце команда CakePHP объявила о запуске альфа-версии CakePHP 3. Команда разработчиков Cake считает, что версия 3 изменит правила игры, поэтому, поскольку альфа-версия версии 3 только что вышла из духовки, эта статья занимает особое место. свежий взгляд на CakePHP 3 как на эффективный современный фреймворк для PHP-разработки.
Краткая история
В наши дни существует так много вариантов, когда дело доходит до разработки PHP. По мере развития PHP на сцену выходит все больше и больше фреймворков PHP, предоставляющих разработчикам широкий выбор вариантов. Но так было не всегда.
В 2005 году, когда PHP 4 все еще был стандартом, PHP-фреймворков не существовало, и разработка объектно-ориентированного подхода к кодированию в PHP, безусловно, была сложной задачей. Именно тогда появился CakePHP — первый в мире фреймворк PHP MVC. За почти 10 лет, прошедших с момента его первого выпуска, CakePHP продолжал развиваться, поддерживая значительную долю рынка PHP-разработчиков.
Насколько популярен фреймворк CakePHP? Он входит в четверку самых популярных PHP-проектов на GitHub, из примерно 130 000 проектов, с более чем 18 000 участников в группе Google CakePHP с 32 000 тем. С 270 участниками кода и 320 участниками документации нельзя отрицать, что у CakePHP много поклонников. Нынешнее широкое распространение и растущая популярность CakePHP хорошо описаны в статье Джеймса Уоттса, основного члена и менеджера сообщества CakePHP для Cake Software Foundation, у которого я брал интервью в ходе написания этой статьи.
Теперь, когда доступна версия 3 фреймворка, ожидается, что CakePHP останется ведущей силой в мире PHP и главным соперником среди современного разнообразного ландшафта фреймворков PHP.
Что нового в версии 3 CakePHP?
Этот обзор основан на альфа-версии CakePHP 3.0, которая включает в себя ряд новых функций и улучшений, в том числе:
Лучшая производительность. Версия 3 включает улучшения производительности процесса начальной загрузки, процесса маршрутизации и нескольких частей процесса создания вспомогательных шаблонов.
Расширенные компоненты и помощники. Версия 3 обеспечивает расширенную поддержку «флэш-сообщений» благодаря новым функциям FlashHelper и FlashComponent. Кроме того, компонент CookieComponent был улучшен, что упрощает разделение конфигурации пространств имен файлов cookie и обработки данных файлов cookie.
Улучшено управление сессиями. Управление сессиями всегда было статическим классом в CakePHP, что оказалось проблематичным во многих отношениях. В версии 3 теперь вы можете получить доступ к сеансу из объекта запроса
$this->request->session()
. Это изменение также упрощает тестирование сеанса и позволяет CakePHP использовать PHPUnit 4.x.Улучшена согласованность соглашений. Скелеты приложений и плагинов были обновлены, чтобы использовать одну и ту же структуру каталогов, чтобы быть более совместимыми друг с другом.
Темы и плагины объединены. Основной целью CakePHP 3 было сделать темы более мощными и надежными. Работая над достижением этой цели, стало очевидно, что на самом деле необходимо, чтобы темы предоставляли те же возможности, что и плагины. Соответственно, любой плагин теперь можно использовать в качестве темы, что также упрощает упаковку и распространение.
Улучшения ORM. Несколько изменений API были внесены в ORM (объектно-реляционное сопоставление). В частности, теперь стало проще указывать глубокие связи для операций сохранения, а несколько соглашений были изменены, чтобы сократить время обучения и путаницу среди новых пользователей.
Кроме того, есть несколько дополнительных функций, которые также планируется включить в бета-версию версии 3.0. Самое главное:
- Улучшения интернационализации и локализации (i18n и L10n)
- Замена CacheHelper на основе Edge SideIncludes
- Новый API маршрутизации для более простого и быстрого объявления маршрута
Действительно, версия 3 представляет собой значительное обновление по сравнению с предыдущими версиями CakePHP.
Почему CakePHP?
Хотя CakePHP имеет много замечательных функций, в этом обзоре основное внимание уделяется некоторым из них, которые действительно помогают выделить его, а именно:
- Соглашение о конфигурации
- ORM CakePHP (объектно-реляционное отображение)
- Компоненты и помощники
Соглашение о конфигурации
CakePHP всегда стремился к быстрой и последовательной разработке, и поэтому CakePHP уделяет большое внимание условностям. Таким образом, подобно Ruby on Rails (из которого CakePHP черпал вдохновение), CakePHP строго придерживается принципа соглашения, а не конфигурации.
Условные обозначения означают, что разработчику не нужно думать о том, «куда идут дела», изучая, как использовать инфраструктуру CakePHP, поскольку значения по умолчанию для этих правил уже установлены. Хотя необходимо ознакомиться с соглашениями CakePHP, после их освоения разработчик может сосредоточиться на основной разработке, а не беспокоиться о том, где размещается код, и о других проблемах конфигурации.
Соглашения CakePHP резко отличаются от самого PHP, который является довольно либеральным языком. В результате своих соглашений CakePHP помогает обеспечить большую согласованность стиля и структуры кодирования между несколькими разработчиками и даже между несколькими командами. Принимая стандартный набор соглашений, Cake стремится сделать разработку более последовательной.
Например, для схемы базы данных CakePHP делает определенные предположения по умолчанию в отношении того, как будут называться определенные переменные, имена таблиц и поля. В частности, Cake ожидает, что:
- Имена таблиц будут во множественном числе (например,
orders
). - Имя поля первичного ключа будет
id
- Имена любых полей внешнего ключа будут основаны на имени ссылочной таблицы, за которым следует
_id
(например, внешний ключ в таблицеcustomers
будет называтьсяcustomer_id
).
В качестве иллюстрации рассмотрим простой обзор двух таблиц ( articles
и users
) из базы данных постов блога. В нашем примере мы скажем, что Articles
«Принадлежит» Users
, а Users
«HasMany» Articles
. Эти отношения будут определены в CakePHP 3.0 следующим образом:
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 знал, что мы не используем значение по умолчанию:
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, когда ему нужно улучшить или поддерживать код, написанный другим разработчиком, поскольку они приводят к единообразной структуре кода и соглашениям для нескольких разработчиков и проектов CakePHP.
Объектно-реляционное отображение CakePHP (ORM)
Объектно-реляционное отображение (ORM) CakePHP значительно выигрывает от рамочных соглашений CakePHP. Настроив схему базы данных в соответствии со стандартами Cake, вы сможете быстро соединить таблицы с помощью мощного ORM Cake. Вам редко потребуется писать оператор SQL, поскольку CakePHP с легкостью обрабатывает такие вещи, как соединения таблиц, hasMany
и даже отношения hasAndBelongsToMany
.

Используя ContainableBehavior
CakePHP, посредством ассоциаций моделей вы можете указать, какие таблицы и поля базы данных следует выбирать из SQL-запроса. Это может углубляться в несколько таблиц, а с помощью ORM легко создавать очень сложные операторы SQL.
Между прочим, ContainableBehavior
в CakePHP — отличный пример того, как CakePHP может упростить и оптимизировать разработку PHP. Это помогает вам искать и фильтровать данные чистым и согласованным способом, а также может помочь увеличить скорость и общую производительность вашего приложения. (Он работает, временно или постоянно изменяя ассоциации ваших моделей, используя предоставленные вложения для создания соответствующей серии bindModel
и unbindModel
.)
Проблема с ORM заключается в том, что он делает использование SQL настолько простым, что, если разработчик не будет осторожен, он или она может написать неэффективные SQL-запросы, не желая этого. Я, конечно, много раз видел плохо написанные приложения Cake, которые не оптимизировали свои запросы. Эти проблемы, как правило, проявляются через пару лет после развертывания системы, когда базы данных становятся больше, а плохо написанные запросы становятся все более медленными.
Основная проблема здесь заключается в том, что до последней версии CakePHP 3 ORM Cake по умолчанию извлекал любые связанные таблицы при выполнении запроса. В результате простой запрос «найти все» потенциально может сильно раздуться, поскольку базовый SQL будет извлекать все данные из всех связанных таблиц. В версии 3 это поведение больше не используется по умолчанию. (И в предыдущих версиях CakePHP это поведение по умолчанию легко отключить, просто добавив public $recursive = -1;
в ваш основной файл AppModel.php
.)
В целом, обзор ORM Cake показывает, что он действительно помогает оптимизировать разработку и при правильном использовании является прекрасным инструментом для быстрого создания сложных запросов. Тем не менее жизненно важно, чтобы разработчики нашли время, чтобы полностью понять ORM и убедиться, что их запросы правильно оптимизированы (как это справедливо для любого языка).
Компоненты и помощники: библиотеки CakePHP
Одной из замечательных особенностей CakePHP являются встроенные библиотеки — Компоненты и Помощники — которые устраняют множество скучных, повторяющихся и утомительных задач разработки. В контексте MVC компоненты помогают упростить разработку контроллера, а помощники упрощают кодирование представления и логику (т. е. уровень представления).
Например, PaginatorComponent
автоматически создает интерфейс следующей/предыдущей страницы из запроса поиска. Добавьте JsHelper
, и вы получите разбиение на страницы AJAX на основе вашего любимого JavaScript-фреймворка (по умолчанию jQuery).
Быстрая выборка других полезных помощников включает в себя:
-
TimeHelper
: упрощает отображение даты и времени, предоставляя набор функций для форматирования и оценки значений времени. -
NumberHelper
: предоставляет удобные методы для отображения чисел в различных распространенных (или настраиваемых) форматах и с точностью. -
TextHelper
: помогает включать ссылки, форматировать URL-адреса, создавать фрагменты текста вокруг выбранных слов или фраз, выделять ключевые слова в блоках текста и изящно обрезать длинные отрезки текста.
И многое другое.
Критика CakePHP 3
Безусловно, у каждого фреймворка есть свои плюсы и минусы, и CakePHP не исключение. Вот некоторые из наиболее распространенных критических замечаний в адрес CakePHP за пределами этого обзора:
«Устаревший фреймворк; раздутый и медленный». Эта критика, как правило, носит скорее исторический характер, и сегодня ее правда ограничена (если вообще есть). Поддержка версий PHP, начиная с PHP 4, исторически требовала от CakePHP решения многих собственных унаследованных проблем PHP. С развитием PHP и, в частности, с выпуском CakePHP версии 3 это утверждение действительно утратило свою актуальность.
«Слишком строгий и ограничивающий». Несмотря на явные преимущества соглашений CakePHP, тем не менее, есть и те, кто их критикует. Критики часто утверждают, что условности слишком строгие, но они не признают (или не признают), что эти условности можно легко обойти. Приняв стандартный набор соглашений, Cake надеется сделать разработку последовательной, что, учитывая расплывчатую практику кодирования PHP, следует рассматривать только как положительный момент.
«Цикл медленного высвобождения». Медленный цикл выпуска не обязательно плох. Наоборот, слишком агрессивный цикл выпуска может быть более проблематичным. Фактически, одна из причин того, что основные версии CakePHP требуют времени, заключается в обеспечении обратной совместимости с более ранними версиями PHP, которые все еще широко используются. Более того, такой консервативный цикл выпуска и упор на обратную совместимость устраняют необходимость значительных (и частых) изменений кода при выпуске новых версий. Следует также отметить, что команда CakePHP 3 совсем не медлительна, когда дело доходит до второстепенных релизов (исправлений ошибок, исправлений, незначительных улучшений и т. д.), которые выпускаются ежемесячно . Точно так же ответы на большинство заявок об ошибках принимаются в течение нескольких часов после публикации.
«Не готовое решение». В отличие от многих других современных PHP-фреймворков «готовых веб-приложений» (таких как Yii, например), CakePHP целенаправленно стремится поддерживать и включать настраиваемые решения. Я лично извлек из этого большую пользу при разработке ряда крупных пользовательских веб-сайтов и приложений, управляемых базами данных.
«Использует массивы данных, а не объекты». Это уже не так, начиная с версии 3. В предыдущих версиях любые данные нужно было хранить и ссылаться на них как на вложенные массивы (например,
$user['User']['username']
). CakePHP 3, наконец, решает эту проблему, вместо этого сохраняя данные в виде объектов (например,$user->username
).«Плохая документация». В этой критике есть некоторая обоснованность, поскольку документация CakePHP, похоже, не всегда была написана с учетом новичка (важная информация иногда обсуждается всего в одном или двух предложениях, тогда как несколько абзацев обсуждения, вероятно, были бы оправданы). ). Команда разработчиков Cake знает об этом и работает над соответствующим улучшением документации. На самом деле, домашняя страница документации CakePHP 3 явно заявляет о высоком уровне приверженности «качеству, достоверности и точности» документации. Поскольку CakePHP является платформой, управляемой сообществом, на каждой странице документации имеется кнопка «Улучшить этот документ», которая позволяет пользователям CakePHP вносить свои дополнения, удаления или исправления в документацию.
Заключение
В целом, спустя почти 10 лет после его первоначального выпуска обзор CakePHP показывает, что он остается ярким и грозным конкурентом многих других PHP-фреймворков, появившихся с тех пор.
CakePHP — это полное и всестороннее решение для разработки. Кодовая база зрелая, а функциональность кажется бесконечной. В целом, Cake был создан для ускорения разработки, что важно не только для разработчиков программного обеспечения, но и для инвесторов. Самая большая стоимость разработки программного обеспечения — это стоимость времени разработки, и CakePHP стремится значительно сократить время разработки.
CakePHP — это проект, управляемый сообществом. Это может стать только лучше, когда все больше и больше людей будут вовлечены. Занимаясь 7 лет и видя, что сообщество продолжает расти, я взволнован этим следующим этапом для CakePHP. Запуск CakePHP 3 и зрелость как PHP, так и CakePHP означают, что фреймворк будет становиться все лучше и лучше.
Если вы ищете решение на основе PHP, которое предлагает множество преимуществ, подобных Ruby on Rails (с точки зрения простоты использования и соглашения по настройке), тогда попробуйте CakePHP. Учебное пособие по блогу CakePHP занимает всего несколько минут, чтобы настроить и запустить, или, альтернативно, CakeCoded предлагает серию понятных уроков, которые помогут познакомить разработчика PHP с CakePHP и начать его использовать. Используя эти ресурсы, вы быстро увидите, насколько CakePHP может ускорить и улучшить ваши усилия по разработке программного обеспечения PHP. Наслаждаться!
Майкл Хоутон (Michael Houghton) — инженер Toptal из Ирландии с большим опытом работы с CakePHP. Он разработал более 100 веб-сайтов с помощью фреймворка, работал с командой CakeDC (коммерческая организация, стоящая за фреймворком CakePHP), представил различные исправления и помог с документацией CakePHP.