Огляд CakePHP 3 — Все ще свіжий, все ще тепленький

9

Від автора: рік тому команда розробників фреймворку CakePHP оголосила про запуск нової альфа-версії CakePHP 3 (нова версія вийшла в березні 2015 року). Розробники фреймворку вважають, що вихід нової версії стане переломним моментом в історії фреймворку, тому разом з тепленьким, прямо з духовки, реліз альфа-версії, народилася і дана стаття, в якій представлений свіжий погляд на CakePHP 3, як на ефективний сучасний фреймворк веб-розробки на PHP.

Огляд CakePHP 3 — Все ще свіжий, все ще тепленький

Коротка історія

В даний час існує величезна кількість варіантів, коли мова заходить про веб-розробки на 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 дані взаємозв’язку визначалися б наступним чином:

// 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, і в багатьох проектах.

Об’єктно-реляційне відображення (ORM) в CakePHP

Об’єктно-реляційне відображення (ORM) в CakePHP дуже сильно виграє завдяки використанню угод фреймворка. Змінюючи схему бази даних відповідно до стандартів CakePHP, ви можете швидко зв’язати таблиці один з одним завдяки потужному ORM в CakePHP. Вам рідко доведеться використовувати SQL-оператори, оскільки CakePHP, наприклад, сам з легкістю обробляє різні види об’єднання таблиць (һаѕМапуи навіть 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. Насолоджуйтесь!