24

我已经使用 CodeIgniter 很长时间了,但是最近我感觉需要转向更高级/更 OOP 框架。Kohana 似乎是一个经常被推荐的选项,我的问题是,Kohana 与 CodeIgniter 到底有什么不同?差异列表,特别是语法差异,会很棒。

4

2 回答 2

46

我将写一篇关于 Kohana 3.1 的文章,以及迄今为止我看到的相对于 CodeIgniter 2 的主要优势。在 Kohana 3.0 之前(一年半前),我使用了 CodeIgniter、ZF、Symfony、Cake 并尝试了许多其他方法(目前尝试做Yii 只是因为我必须这样做)。我知道很多人会因为“主观”而对我吐口水。前进。

严格的 PHP 5.2

Kohana 在当前版本中不使用任何旧代码(即 2.x 或 CodeIgniter 的)。它被完全重写为完全面向对象而不是妨碍开发人员的方式。简而言之,使用它进行开发感觉很自然,就像它是 PHP 开发的“方式”一样。

这是一个“由社区、为社区”构建的框架,并非出于宣传目的。不是由/为任何社区,而是一个非常利特的社区。

CodeIgniter 在 PHP4 上停留太久了。查看 CI2 的源代码,我不能说他们已经完全转向 PHP5(假设 PHP 5.1 并不是真正的…… PHP 5)。我见过 FuelPHP,它似乎更像是 CI2 与 Kohana 的混搭,而不是 CI2 分支,但我不得不说它绝对有潜力。

HMVC

Kohana 感觉自然的主要原因就是源于这种模式。这个想法是隔离每个请求以尊重该模式,并最终尊重 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);
}

没有障碍

Kohana 背后的团队致力于使框架“尽可能做到最好”,而不是“尽可能做到最好,因为我们……有太多空闲时间”。每个维护版本都向后兼容以前的版本(例如 3.1.2 和 3.1.0),所有“主要”更改都等待次要版本(例如 3.1 不完全向后兼容 3.0“开箱即用”)。以前的次要版本在新版本发布后维护 6 个月。

扩展(ding|sions)

Kohana 的级联文件系统可以非常轻松地扩展现有组件,甚至是供应商使用的组件。您可以覆盖应用程序/模块级别的所有内容,而无需考虑在任何地方手动设置包含/加载路径(因为所有文件和文件夹都遵循相同的约定)。

一大堆模块,包括 Zend Framework。怎么样?简而言之,您甚至可以使用 ZF 或任何其他库作为 Kohana 应用程序中的模块。

除了所有社区构建的模块外,每个 Kohana 安装都包括一些几乎每个应用程序都可以从中受益的模块:

  • Auth 一个简单但非常强大的身份验证库。模块本身仅提供文件验证驱动程序,但启用 ORM 为我们提供了更强大的驱动程序。

  • 缓存 缓存库,包含适用于最流行缓存技术的驱动程序:APC、eAccelerator、文件、memcache、SQLite、Wincache 和 Xcache。它非常容易实现和更改(即使缓存驱动程序的后期更改也是单行的)。

  • Codebench 如果您需要对某些代码进行基准测试,Codebench 为您提供了一种非常简单的方法。

  • 数据库 与 Kohana 中的所有其他内容一样,数据库模块也是完全面向对象且可扩展的。带有完整的 MySQL 和 PDO 支持。

  • Image 一个简单的图像处理模块

  • ORM 默认 ORM 基于 ActiveRecord 模式,充分利用 Database 模块结合 PHP 5 魔术方法的优点。除此之外,您还可以使用 Jelly、Sprig、AutoModeler 或任何其他自定义 PHP 库,如 Doctrine。

  • Unittest Kohana 预装了一个很棒的单元测试模块。它基于 PHPUnit 并与您的应用程序完全“集成”,让您非常容易 TDD。此外,整个框架都经过单元测试。

  • 用户指南 尽管大多数开发人员都忽略了这个模块,但这个模块是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)。最后,post 对象 (Model_Post) 和 errors 数组都被传递给 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();
        }
    }
}

其中非法()可以是一些带有花哨连接和东西的自定义模型级方法。我知道这个块看起来是多么的低效,它只是一个代码示例,而不是“连接比附加查询更好”:)

于 2011-04-17T17:24:49.643 回答
0

请查看https://stackoverflow.com/questions/717836/kohana-or-codeigniter链接 - http://onwired.com/blog/exploring-kohana-as-an-alternative-to-codeigniter/ - 向我回答了大部分相同的问题。

于 2011-04-17T11:12:12.857 回答