Как-то я пообещал сравнить Yii с CodeIgniter.
Думаю, на данный момент я достаточно распробовал Yii, чтобы адекватно сравнить
два замечательных фреймворка.
Активный разработчик у ядра Yii на данный момент один, но в планах привлечение к
разработке сообщества. Пожелания, если они адекватны, учитываются.
CodeIgniter разрабатывается компанией под свои нужды. Предложения по крупным
изменениям в ядре чаще всего игнорируются.
Документация CodeIgniter, наверное, так и останется для меня эталоном. 90% всего
функционала описаны довольно компактно, простым языком и отлично оформлены.
Пишется документация исключительно разработчиками. Адекватные пожелания принимаются и
рассматриваются. Перевод на русский делался довольно давно. Основные моменты всё
ещё актуальны, но некоторые части пора обновлять.
Yii более сложен и достаточно молод. Поэтому документация не охватывает некоторых
интересных мест (впрочем, неплохо описанных в API). Тем не менее, от этого
разработчик не страдает: описаны самые типичные моменты, которые в большинстве
случаев и придётся использовать. Язык документации больше похож на научный (в тех
частях русского перевода, которыми занимался я попытался строить предложения
попроще). Оформление аккуратное, но не вызывает умиления как это делает
документация по CodeIgniter.
Документация пишется разработчиками. Пожелания принимаются. Перевод осуществляется
несколькими командами разработчиков. Делается это централизованно с использованием
SVN. Вступить в команду переводчиков может любой желающий.
Yii написан на PHP5.2 (с PHP5.3 тоже работает) и не поддерживает PHP4. Используется
довольно много нового для PHP5.2 функционала. Для работы необходим PDO.
CodeIgniter совместим с PHP4 и использует PHP как раз на уровне четвёртой версии. На PHP5.3 пока не заводится.
CodeIgniter известен своей лёгкостью и скоростью работы. Yii также очень быстр,
особенно если рассматривать достаточно гибкие фреймворки. На официальном сайте Yii
есть сравнение скорости работы.
Структура директорий настраивается лучше, чем в CI. Наверное потому, что в CI
структура по умолчанию понятнее и запросов на её кардинальное изменение не много.
Я лично перенастроил Yii на структуру, похожую на CI.
В CI очень неплохо сделана загрузка классов. Кое-что грузится автоматически,
остальное — через $this->load. В Yii автоматически грузится всё, что указано в
файлах конфигурации.
Механизм построения URL в Yii на первый взгляд похож на CI, но поддерживает такие
приятные штуки как отключение маршрутов по умолчанию и нормальную поддержку GET.
Для именования в Yii используются постфиксы MyController против My в CI,
actionMyCool() против mycool в CI. Это решает проблему с дублирующимися
именами классов, и открытыми методами часто возникающую в CI.
В общем, в Yii контроллер более гибок.
Из неудобств: параметры, переданные через URL приходится получать из $_GET, а не
из параметров метода, как это было в CI.
View в CodeIgniter откровенно слабый, хотя, если использовать сторонние решения
(http://code-igniter.ru/wiki/View, http://code-igniter.ru/wiki/View_helper) всё
не так уж и плохо.
Yii в этом плане очень хорош. Поддерживаются layout-ы, вложенные view, виджеты,
есть API для реализации своих шаблонизаторов (с уже реализованным «компилированием»)
в код на PHP.
В CI модель непосредственно связана с базой данных. Других моделей просто нет.
В Yii модель может использовать ActiveRecord, а может и не работать с базой.
Active Record в CodeIgniter всегда вызывал у меня смешанные чувства: с одной стороны
некоторые операции делать было приятно, с другой… в общем-то синтаксис дублировал SQL
без явных плюсов. Результат возвращался в виде массива, либо в виде stdClass.
В Yii ситуация намного приятней: AR тут поддерживает отложенную загрузку и отношения.
Данные представлены моделями, для которых можно определить валидаторы, свои методы и
даже behavior-ы (примерно такие, как в Doctrine).
Валидатор в Yii на голову опережает CodeIgniter. Можно использовать валидаторы
модели, есть достаточно много встроенных правил валидации и легко реализовать
свои.
В Yii можно забыть про CodeIgniter-ский MY_. Всё делается нормальным ООП-способом.
На данный момент в Yii я не встретил тупикового кода, который не выходило бы перекрыть.
В CI я сталкивался с такими тупиковыми местами несколько раз. Решение находилось,
но каждый раз довольно грязное.
В CodeIgniter можно включить механизм хуков ядра, подобный Drupal. В Yii для достижения
сходного функционала ничего включать не надо: ядро само по себе даёт довольно
много методов для выполнения своего кода в определённые моменты.
Встроенных классов для работы с почтой, изображениями, FTP, ZIP, Trackback,
скаффолдинга.
Также в Yii нет хелперов в том виде, который был в CI, но ничто не запрещает их
реализовать… или позаимствовать, например, из Kohana.
Хорошего гибкого API, консоли, генерации классов, гибкой системы прав,
нормального кеша, моделей как таковых, нормальной реализации сессий, ООП.
А итога не будет. Каждый выбирает инструмент сам ;)
Если я что-то упустил или есть желание узнать, как обстоят дела с другими возможностями в CodeIgniter или Yii — задавайте вопросы в комментариях.
Думаю, на данный момент я достаточно распробовал Yii, чтобы адекватно сравнить
два замечательных фреймворка.
Разработчики
Активный разработчик у ядра Yii на данный момент один, но в планах привлечение к
разработке сообщества. Пожелания, если они адекватны, учитываются.
CodeIgniter разрабатывается компанией под свои нужды. Предложения по крупным
изменениям в ядре чаще всего игнорируются.
Документация
Документация CodeIgniter, наверное, так и останется для меня эталоном. 90% всего
функционала описаны довольно компактно, простым языком и отлично оформлены.
Пишется документация исключительно разработчиками. Адекватные пожелания принимаются и
рассматриваются. Перевод на русский делался довольно давно. Основные моменты всё
ещё актуальны, но некоторые части пора обновлять.
Yii более сложен и достаточно молод. Поэтому документация не охватывает некоторых
интересных мест (впрочем, неплохо описанных в API). Тем не менее, от этого
разработчик не страдает: описаны самые типичные моменты, которые в большинстве
случаев и придётся использовать. Язык документации больше похож на научный (в тех
частях русского перевода, которыми занимался я попытался строить предложения
попроще). Оформление аккуратное, но не вызывает умиления как это делает
документация по CodeIgniter.
Документация пишется разработчиками. Пожелания принимаются. Перевод осуществляется
несколькими командами разработчиков. Делается это централизованно с использованием
SVN. Вступить в команду переводчиков может любой желающий.
Совместимость
Yii написан на PHP5.2 (с PHP5.3 тоже работает) и не поддерживает PHP4. Используется
довольно много нового для PHP5.2 функционала. Для работы необходим PDO.
CodeIgniter совместим с PHP4 и использует PHP как раз на уровне четвёртой версии. На PHP5.3 пока не заводится.
Скорость
CodeIgniter известен своей лёгкостью и скоростью работы. Yii также очень быстр,
особенно если рассматривать достаточно гибкие фреймворки. На официальном сайте Yii
есть сравнение скорости работы.
Структура директорий
Структура директорий настраивается лучше, чем в CI. Наверное потому, что в CI
структура по умолчанию понятнее и запросов на её кардинальное изменение не много.
Я лично перенастроил Yii на структуру, похожую на CI.
Автозагрузка
В CI очень неплохо сделана загрузка классов. Кое-что грузится автоматически,
остальное — через $this->load. В Yii автоматически грузится всё, что указано в
файлах конфигурации.
Роутер
Механизм построения URL в Yii на первый взгляд похож на CI, но поддерживает такие
приятные штуки как отключение маршрутов по умолчанию и нормальную поддержку GET.
Контроллер
Для именования в Yii используются постфиксы MyController против My в CI,
actionMyCool() против mycool в CI. Это решает проблему с дублирующимися
именами классов, и открытыми методами часто возникающую в CI.
В общем, в Yii контроллер более гибок.
Из неудобств: параметры, переданные через URL приходится получать из $_GET, а не
из параметров метода, как это было в CI.
Отображение
View в CodeIgniter откровенно слабый, хотя, если использовать сторонние решения
(http://code-igniter.ru/wiki/View, http://code-igniter.ru/wiki/View_helper) всё
не так уж и плохо.
Yii в этом плане очень хорош. Поддерживаются layout-ы, вложенные view, виджеты,
есть API для реализации своих шаблонизаторов (с уже реализованным «компилированием»)
в код на PHP.
Модель
В CI модель непосредственно связана с базой данных. Других моделей просто нет.
В Yii модель может использовать ActiveRecord, а может и не работать с базой.
Active Record
Active Record в CodeIgniter всегда вызывал у меня смешанные чувства: с одной стороны
некоторые операции делать было приятно, с другой… в общем-то синтаксис дублировал SQL
без явных плюсов. Результат возвращался в виде массива, либо в виде stdClass.
В Yii ситуация намного приятней: AR тут поддерживает отложенную загрузку и отношения.
Данные представлены моделями, для которых можно определить валидаторы, свои методы и
даже behavior-ы (примерно такие, как в Doctrine).
Валидация форм
Валидатор в Yii на голову опережает CodeIgniter. Можно использовать валидаторы
модели, есть достаточно много встроенных правил валидации и легко реализовать
свои.
Расширяемость
В Yii можно забыть про CodeIgniter-ский MY_. Всё делается нормальным ООП-способом.
На данный момент в Yii я не встретил тупикового кода, который не выходило бы перекрыть.
В CI я сталкивался с такими тупиковыми местами несколько раз. Решение находилось,
но каждый раз довольно грязное.
Хуки
В CodeIgniter можно включить механизм хуков ядра, подобный Drupal. В Yii для достижения
сходного функционала ничего включать не надо: ядро само по себе даёт довольно
много методов для выполнения своего кода в определённые моменты.
Чего нет в Yii
Встроенных классов для работы с почтой, изображениями, FTP, ZIP, Trackback,
скаффолдинга.
Также в Yii нет хелперов в том виде, который был в CI, но ничто не запрещает их
реализовать… или позаимствовать, например, из Kohana.
Чего нет в CI
Хорошего гибкого API, консоли, генерации классов, гибкой системы прав,
нормального кеша, моделей как таковых, нормальной реализации сессий, ООП.
Итог
А итога не будет. Каждый выбирает инструмент сам ;)
Если я что-то упустил или есть желание узнать, как обстоят дела с другими возможностями в CodeIgniter или Yii — задавайте вопросы в комментариях.