Я давно использую CodeIgniter, но в последнее время мне кажется, что нужно переходить на более продвинутую/более OOP-структуру. Кохана, кажется, часто рекомендуемый вариант, мой вопрос: как именно Кохана отличается от CodeIgniter? Список различий, особенно различий в синтаксисе, будет большим.
Как Кохана отличается от CodeIgniter?
Ответ 1
Я расскажу о Kohana 3.1 и основных преимуществах, которые я видел по сравнению с CodeIgniter 2. До Kohana 3.0 (полтора года назад) я использовал CodeIgniter, ZF, Symfony, Cake и пробовал много других (на данный момент пытаюсь сделать Yii только потому, что мне нужно). Я знаю, что многие будут на меня наплевать на "субъективность". Идем дальше.
Строгий PHP 5.2
Kohana не использует какой-либо старый код (что означает 2.x или CodeIgniter) в текущей версии. Он был полностью переписан, чтобы быть полностью объектно-ориентированным, а не заниматься разработчиком. Проще говоря, он чувствует себя естественно развиваться вместе с ним, как "путь" для разработки PHP.
Это структура, построенная "сообществом, для сообщества", а не для рекламных целей. И не для какого-либо сообщества, а для самого сообщества.
CodeIgniter все еще стоял слишком долго, зависая на PHP4. Глядя на источник CI2s, я не могу сказать, что они полностью перешли на PHP5 (скажем, PHP 5.1 не очень... PHP 5). Я видел FuelPHP, который, похоже, больше похож на mashup CI2 с Kohana, чем на CI2, хотя я должен сказать, что он определенно имеет потенциал.
HMVC
Основная причина, по которой Кохана чувствует себя естественной, родилась из этой картины. Идея заключалась в том, чтобы изолировать каждый запрос, чтобы уважать шаблон, и это закончилось тем, что соблюдено RFC 2616. Теперь у вас есть отдельный объект Response для каждого запроса, который может использовать ваш код очень аккуратно. Сейчас я работаю над веб-сервисом, который используется с iPhone, Android и веб-приложением. Я не могу описать, какую привилегию вызывать API "внутри". Исходный пример:
public function action_delete()
{
$deleted = Request::factory('api/route')
->method(Request::DELETE)
->headers('Accept', 'text/html')
->execute();
$this->response->body($deleted);
}
Без гандикапов
Команда, стоящая за Коханой, посвящена созданию рамки , которая может быть, а не "всем, чем она может быть, потому что у нас есть слишком много свободного времени". Каждая версия обслуживания обратно совместима с предыдущими (например, 3.1.2 с 3.1.0), все основные изменения ждут младших версий (например, 3.1 не полностью обратно совместима с 3.0 "из коробки" ). Предыдущие второстепенные версии сохраняются в течение 6 месяцев после выпуска нового.
EXTEN (динь | сии)
Kohana Каскадная файловая система позволяет очень просто расширить существующие компоненты или даже те, которые используются поставщиками. Вы можете переопределить все на уровне приложений/модулей, не задумываясь о том, как включать/переносить пути вручную в любом месте (поскольку все файлы и папки соответствуют одному и тому же соглашению).
Существует целая группа модулей, включая Zend Framework. Как это? Проще говоря, вы даже можете использовать ZF или любую другую библиотеку в качестве модуля внутри своего приложения Kohana.
Помимо всех модулей, построенных в сообществе, каждая установка Kohana включает в себя несколько, которые могут извлечь из почти любого приложения:
-
Auth Простая, но очень мощная библиотека аутентификации. Сам модуль предоставляет только драйвер файла auth, но включение ORM дает нам более мощный.
-
Кэш Кэширование библиотеки с драйверами для самых популярных методов кеширования: APC, eAccelerator, файл, memcache, SQLite, Wincache и Xcache. Его очень легко реализовать и изменить (даже позже изменения драйвера кэша являются однострочным).
-
Codebench Если вам нужно проверить некоторый код, Codebench предоставляет вам очень простой способ сделать это.
-
База данных Как и все остальное в Кохане, модуль базы данных также полностью объектно-ориентированный и расширяемый. Поставляется с полной поддержкой MySQL и PDO.
-
Изображение Простой модуль для легкого манипулирования изображениями
-
ОРМ По умолчанию ORM основан на шаблоне ActiveRecord, полностью используя преимущества модуля базы данных в сочетании с магическими методами PHP 5. Помимо этого вы можете использовать Jelly, Sprig, AutoModeler или любые другие пользовательские PHP-библиотеки, такие как Doctrine.
-
UnitTest Kohana поставляется с предварительно упакованным большим модульным модулем тестирования. Он основан на PHPUnit и полностью "интегрируется" с вашим приложением, что позволяет вам очень простое TDD. Кроме того, вся инфраструктура тестируется блоком.
-
UserGuideНесмотря на то, что большинство разработчиков игнорируется, этот модуль является одним из самых мощных функций Kohanas. Он обеспечивает самый простой способ отслеживания вашего API и остальной части документации Kohana. Почему у вашего приложения не было своего "собственного гида"? Вам даже не нужно об этом думать! Пока вы отслеживаете комментарии/соглашения в своем коде, этот модуль позаботится обо всех остальных.
Примеры кода
Код более аккуратный, чем CI, причем все классы загружены автоматически, хотя соглашения очень похожи.
Пример обновления (с использованием ORM):
public function action_update($post_id)
{
$post = ORM::factory('post', $post_id);
$errors = array();
if ($values = $this->request->post())
{
try
{
$post->values($values)->update();
$this->request->redirect('post');
}
catch (ORM_Validation_Exception $e)
{
$errors += $e->errors();
}
}
$this->template->content = View::factory('post/update', array(
'post' => $post,
'errors'=> $errors,
));
}
В этом примере ORM используется для обновления строки, имея update() вызов метода check() для проверки его значений. В случае сбоя проверки исключается исключение ORM_Validation_Exception, а остальная часть блока try не выполняется (например, перенаправление на/сообщение). В конце, как объект post object (Model_Post), так и массив ошибок передаются в View, к которому они могут быть доступны напрямую.
Обратите внимание, что все методы Database_Query_Builder доступны внутри ORM, поэтому вы также можете использовать "причудливые" вещи, например:
ORM::factory('post')
->where('user_id','=',$user_id)
->join('users','INNER')
->on('users.id','=','posts.user_id')
->find_all();
Или (с отношениями):
$user = ORM::factory('user', $id);
foreach ($user->posts->find_all() as $post)
{
foreach ($post->quotes->find_all() as $quote)
{
if ($quote->illegal())
{
$quote->delete();
}
}
}
Если незаконным() может быть какой-то пользовательский метод уровня модели с причудливыми объединениями и т.д. Я знаю, насколько неэффективен этот кусок, это просто пример кода, а не "JOINs лучше, чем дополнительные запросы":)
Ответ 2
Пожалуйста, посмотрите https://stackoverflow.com/info/717836/kohana-or-codeigniter, где ссылка - http://onwired.com/blog/exploring-kohana-as-an-alternative-to-codeigniter/ - ответил на этот самый самый вопрос мне.