我将写一篇关于 Kohana 3.1 和迄今为止我看到的相对于 CodeIgniter 2 的主要优势的文章。在 Kohana 3.0 之前(一年半前),我使用了 CodeIgniter、ZF、Symfony、Cake 并尝试了许多其他方法(目前尝试做 Yii 只是因为我必须这样做)。我知道很多人会因为“主观”而对我吐口水。来吧。
严格的 PHP 5.2
Kohana 在当前版本中不使用任何旧代码(即 2.x 或 CodeIgniter 的)。它被完全重写为完全面向对象而不是妨碍开发人员的方式。简而言之,使用它进行开发感觉很自然,就像它是 PHP 开发的“方式”一样。
这是一个“由社区、为社区”构建的框架,并非用于宣传目的。不是由/为任何社区,而是一个非常利特的社区。p>
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 的Cascading File System 可以非常轻松地扩展现有组件,甚至是供应商使用的组件。您可以覆盖应用程序/模块级别的所有内容,而无需考虑在任何地方手动设置包含/加载路径(因为所有文件和文件夹都遵循相同的约定)。
有一个whole bunch of modules,包括 Zend Framework。怎么样?简而言之,您甚至可以将 ZF 或任何其他库用作 Kohana 应用程序中的模块。
除了所有社区构建的模块外,每个 Kohana 安装都包含一些几乎每个应用程序都可以从中受益的模块:
授权
一个简单但非常强大的身份验证库。模块本身只提供文件验证驱动,但启用 ORM 为我们提供了更强大的驱动。
缓存
具有最流行缓存技术驱动程序的缓存库:APC、eAccelerator、文件、memcache、SQLite、Wincache 和 Xcache。它非常容易实现和更改(即使缓存驱动程序的后期更改也是单行的)。
代码台
如果您需要对某些代码进行基准测试,Codebench 为您提供了一种非常简单的方法。
数据库
与 Kohana 中的所有其他内容一样,数据库模块也是完全面向对象且可扩展的。提供完整的 MySQL 和 PDO 支持。
图片
一个简单的图像处理模块
ORM
基于 ActiveRecord 模式的默认 ORM,充分利用了 Database 模块结合 PHP 5 魔术方法的优点。除此之外,您还可以使用 Jelly、Sprig、AutoModeler 或任何其他自定义 PHP 库,如 Doctrine。
单元测试
Kohana 预装了一个很棒的单元测试模块。它基于 PHPUnit 并与您的应用程序完全“集成”,让您非常简单的 TDD。此外,整个框架都经过单元测试。
用户指南
尽管大多数开发人员都忽略了这个模块,但该模块是 Kohanas 最强大的功能之一。它提供了最简单的方法来跟踪您的 API 和 Kohana 文档的其余部分。为什么您的应用程序也没有自己的指南?你甚至不必考虑它!只要您跟踪代码中的 cmets / 约定,这个模块就会处理其余的事情。
代码示例
代码比 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();
}
}
}
其中非法()可以是一些带有花哨连接和东西的自定义模型级方法。我知道这个块看起来是多么的低效,它只是一个代码示例,而不是“连接比附加查询更好”:)