CodeIgniter vs. CakePHP
21 October 2007 | Рубрика: PrimaryНиже находится перевод статьи Джонатана Снука (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. Я намерено не стал касаться вопроса производительности, т.к. довольно проблематично подготовить и провести тестирование каждой опции.

October 21st, 2007 5:27 pm
Интересно, но не интригующе. Настолько толерантное сравнение, что в результате каждый останется при своём мнении. :)))
Впрочем, автор статьи (Д.Снук) кажется, именно такое, нейтральное “сравнение” и хотел.
Поэтому скорее не CI vs CP, а CI & CP - близнецы братья :)
October 22nd, 2007 4:39 pm
А насчет scaffolding ты уверен в точности перевода, потому что в CI scaffolding это возможность в отображения таблиц БД из любого контроллера по секретному слову + возможность модификации этих таблиц
October 26th, 2007 3:01 pm
Интересная публикация
October 31st, 2007 1:30 pm
Спасибо, за перевод!
Я тоже как-то пытался сравнивать различные FW, но делал сравнение по большему числу FW, но и более поверхностно.
Но к чему я пришел, так это, что у CI по скорости и простоте нет равных. Этот FW отлично подходит для разработки различных промо-сайтов и других небольших проектов.
November 8th, 2007 6:31 pm
Считаю CI лучшим! CMF нового поколения, так сказать, т.к. технология должна развиваться и рости, а не находиться в тупике из-за старой документации.
Это конечно предвзятое мнение, скажите вы. Н, имхо, на то оно и мнение, чтобы, возможно, быть опровергнутым.
Кстати, я не писал на CP, но по внешнему виду кодов она показалась мне сложной. А зачем тебе сложный фреймвёрк, если он должен облегчать работу, что хорошо продемонстрировано в CI.
Плюс скорость работы CI хороша. Говорят, что это эталон скорости.
Вообщем, подведя итоги, скажу, что разработчики CI добросовестно выполнили свои задачи, а именно: упростить создание php-преложений и сделать работу приложения максимально быстрой.
February 24th, 2008 4:55 pm
В новой версии 1.6 в CodeIgniter все сильно поменялось, убрали лапшу из исходников, увеличили скорость и функционал, а так же перевели мануал на русский здесь: http://code-igniter.ru
April 18th, 2008 7:42 am
В новой версии 1.6 скорость как раз заметно упала.
April 18th, 2008 10:24 am
Serega011, ссылка на бенчмарки?
April 18th, 2008 10:50 am
Зачем мне ссылка я переделал большой проект с предыдущей версии на CI 1.6 - в итоге заметно замедление.
April 18th, 2008 10:52 am
Serega011, может быть вы криво переделали?
April 18th, 2008 10:56 am
Переделка заключалась в добавлении некоторых своих функций в код CI, функции одинаковы что для версии 1.5.4 что для 1.6. Так что проблема(если это конечно проблема) именно в самом фреймворке. Про замедление по сравнению с предыдущей версии были высказывания еще то ли на родном форуме CI, то ли наhttp://groups.google.com/group/codeigniter-ru?hl=ru