Как стать автором
Обновить

CodeIgniter vs. CakePHP

Время на прочтение6 мин
Количество просмотров1.8K
Ниже находится перевод статьи Джонатана Снука (Jonathan Snook) о преимуществах и недостатках двух популярных PHP фреймворков CakePHP и CodeIgniter.

Прежде чем публиковать такого рода публикации, я обычно опасаюсь за всякого рода фанатиков, которые неадекватно реагируют на подобные сравнения. Поэтому стараюсь максимально объективно подойти к повествованию. Все выводы в статье сделаны только на основании фактов.

Я сопоставляю эти две платформы друг против друга, но безоговорочного победителя здесь нет. Обе имеют как сильные, так и слабые стороны, а также полные провалы в той или иной опции, которая для вас может оказаться необходимой.

Зачем сравнивать?


CakePHP и CodeIgniter во многом очень похожи между собой, включая то, что оба поддерживают PHP4. Говоря о преимуществах одной платформы, мы тут же можем сослаться на сильные стороны другой.

Они обе дают возможность работать в парадигме MVC архитектуры, что просто означает их способность разделять Модель (данные), Контроллер (который направляет данные из модели, чтобы получить представление) и Вид (то, что видит пользователь).

Они обе используют роутинг, который дает возможность привязывать URL к определенной функции внутри контроллера (в CakePHP это называется actions). CodeIgniter поддерживает регулярные выражения для роутинга, в то время как нужно дожидаться релиза CakePHP версии 1.2 для поддержки этой функции. Поправка: CakePHP 1.1 уже поддерживает регулярные выражения для роутинга, но это не отражено в документации.

Они обе поддерживают scaffolding, который помогает автоматически сгенерировать Вид на основании Модели. В CodeIgniter scaffolding упрощен и позволяет получить доступ к подобному функционалу путем добавления ключевого слова в URL. Считаю это недостатком, т.к. часто разрабатываю персональные проекты не для публичного использования, и это ключевое слово надоедает.

Приступим…

Подход к простоте


Я убежден, что CodeIgniter притягивает благодаря своей простоте. Большая часть работы — это создать контроллер, загрузить библиотеки, получить данные из Модели и отправить результат в Вид. Все предельно понятно и вы можете наблюдать, как это работает.

Простота в CakePHP достигается за счет автоматизации (“automagic”). Это делает процесс кодинга быстрым, но без изучения ядра, вы просто будете сами себе задавать вопрос “что сейчас происходит?” Что касается меня, то предпочитаю понимать, как все работает. Начинающих разработчиков этот аспект просто приводит в уныние.

Работа с моделями


Оперирование Моделью в CodeIgniter очень наглядно и позволят применять стандартный SQL в сочетании с некоторыми командами как в этом примере:
$query = $this->db->getwhere('mytable', array(id => $id), $limit, $offset);

$this->db->select('title')->from('mytable')->where('id', $id)->limit(10, 20);
$query = $this->db->get();

Примечание: метод цепочки (chaining) применяющийся во второй части примера может работать только в PHP5.

Вы также можете создать объект модели, загрузить его и, оперируя различными методами, выполнять определенные задачи. При желании это лучше делать на уровне модели, а не контроллера, чтобы код оставался в рамках MVC.

У CakePHP немного другой подход, который заключается в автоматической подгрузке модели, соответствующей данному контроллеру (контроллеры и модели, имеющие одинаковые имена, связаны между собой). Вы можете отключить эту автоподгрузку и даже указать самостоятельно любые модели, которые должны быть загружены в нужный контроллер.
Кроме того, CakePHP имеет в своем арсенале механизм, помогающий устанавливать связи между моделями, что помогает очень облегчить извлечение данных. Например, находясь в контроллере post_controller можно сделать следующее:

$this->Post->Comment->findAllByPostId($id)

Я выбрал этот пример, потому что он помогает продемонстрировать две разные концепции. Во-первых видно, как я получаю доступ к модели комментариев через модель поста (благодаря установленной ассоциации в модели поста). Во-вторых, благодаря методу findAllByPostId. CakePHP позволяет извлекать записи из базы через запросы findByX и findAllByX где X — это эквивалент названия поля, откуда делается выборка.
Думаю, Cake неплохо демонстрирует одну из своих лучших сторон в способности автоматически подгружать ассоциированные данные. Взгляните сюда:

$this->Post->findById($id)

Этот запрос даст нам не только публикацию, но и комментарии к ней. Довольно практично.

Валидация


Когда работаете с моделями, вам неизбежно придется иметь дела с валидацией данных. В CodeIgniter этот функционал представлен классом validation class. С помощью него объявляется набор правил и присоединяется к объекту верификации. Объект валидации автоматически (я предполагаю) проверяет данные, поступающие от URL или формы. Разумеется, здесь вы можете сами определить, как это будет происходить. Validation class может также помочь в процессе определения сообщений об ошибках для того или иного поля.

В CakePHP валидация осуществляется прямо через модель двумя способами. Первый способ производит верификацию всей модели, а второй — каждого поля в отдельности и дает нам в нагрузку callback beforeSave для определенных полей.

Версия CakePHP 1.2 будет включать в себя переработанную систему валидации, для увеличения гибкости.

Виды


CakePHP сразу включает в себя шаблон по умолчанию и имеет две переменные: title_for_layout и content_for_layout. Любое действие автоматически привязывается к определенному виду (снова «automagic»). И до тех пор, пока вы будете называть ваши файлы особым образом, контроллеры будут автоматически связаны моделями и видами. Соответственно, обойти все это, и определить собственные шаблоны и файлы видов не представляет собой проблемы. К сожалению, нет удобного способа получить сгенерированный код вида, а отсюда и проблемы с реализацией механизма кэширования.

У CodeIgniter подход проще и почти сводится к обыкновенному include'ингу. Каждый файл загружается и обрабатывается. Есть и встроенный шаблонизатор (templating class), но он не проще встроенного обработчика видов (built-in view handling). Вы можете делать на манер CakePHP, постоянно включая в шаблон header и footer, но это будет только внешнее сходство. CodeIgniter позволяет заменить механизмы видов и кэширования сторонними или собственными шаблонизаторами. (И все же Smarty отлично внедряется как в CodeIgniter, так и в CakePHP. — прим. переводчика)

Встроенные возможности


CodeIgniter, по моему усмотрению, тут безоговорочно выигрывает благодаря таким классам как FTP, Email, File Uploading, XMLRPC, Zip encoding и многим другим.

CakePHP в свою очередь может похвастаться обширным репозиторием (the Bakery). Вы можете без труда, как в CodeIgniter, подключить любые необходимые классы. Что интересно: хоть я и не пробовал этого делать, но есть возможность подключать многие классы, написанные для CI к CakePHP.

Автоподгрузка


CakePHP позволяет вносить в приложения обширные изменения путем модификации базового контроллера. Также вы можете создать глобальные методы, используя файл модели, что в последствии не помешает вам вносить правки уже на уровне контроллера с помощью обратных вызовов (callbacks), таких как beforeFilter, afterFilter и beforeRender. Похожим образом помощники (helpers) и компоненты могут быть подгружены на уровне индивидуального контроллера.

CodeIgniter умеет подгружать помощников, библиотеки и плагины, но делает это глобально для всего приложения. (Здесь автор ошибается, т.к. в CI на уровне контроллера доступна такая конструкция: $this->load->whatever() — прим. переводчика.)

Документация


Документация — это ключ к пониманию любого фреймворка для того, чтобы разрабатывать на нем.

CodeIgniter имеет полный документированный список всех компонентов с каждым из их методов и параметров. У CI есть форумы и wiki с множеством фрагментов пользовательского кода.

CakePHP в свою очередь, не так хорошо организован. Мануал устаревший и не раскрывает того, что нам предлагает API. Кроме формата оригинальной документации можно получить оффлайн версию в CHM или PDF. Но все же у CakePHP есть Bakery, с пользовательскими статьями и компонентами. Очень помогает команда разработчиков через IRC каналы (#cakephp at irc.freenode.net). А также довольно активная Google-группа.

Напоследок


Я довольно прагматичный человек и искренне верю, что у обоих из представленных фреймворков большое будущее. Они помогают подойти к разработке проектов более доступными средствами, чем это реализуется, например, с помощью Symfony.

Я лично остаюсь больше фаном CakePHP чем CodeIgniter за его «automagic». И это достоинство более явно раскроет себя от версии к версии.

Уточнение


Это сравнение было основано на документации для CodeIgniter 1.5.2 и опыте использования CakePHP 1.1. Я намерено не стал касаться вопроса производительности, т.к. довольно проблематично подготовить и провести тестирование каждой опции.
Теги:
Хабы:
Всего голосов 30: ↑22 и ↓8+14
Комментарии84

Публикации