Подтвердить что ты не робот

Как Кохана отличается от CodeIgniter?

Я давно использую CodeIgniter, но в последнее время мне кажется, что нужно переходить на более продвинутую/более OOP-структуру. Кохана, кажется, часто рекомендуемый вариант, мой вопрос: как именно Кохана отличается от CodeIgniter? Список различий, особенно различий в синтаксисе, будет большим.

4b9b3361

Ответ 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 лучше, чем дополнительные запросы":)