Cli*_*ote 23 php codeigniter kohana kohana-3 codeigniter-2
我一直在使用CodeIgniter很长一段时间,但是最近我一直觉得需要转向更先进/更多的OOP框架.Kohana似乎是一个经常被推荐的选项,我的问题是,Kohana与CodeIgniter有何不同?差异列表,特别是语法差异,会很棒.
Kem*_*emo 46
我将写关于Kohana 3.1以及迄今为止我在CodeIgniter 2上看到的主要优势.在Kohana 3.0之前(一年半前),我使用了CodeIgniter,ZF,Symfony,Cake并尝试了许多其他的(目前只是因为我必须尝试做 Yii).我知道很多人会因为"主观"而吐在我身上.前进.
Kohana在当前版本中不使用任何旧代码(意思是2.x或CodeIgniter).它完全被重写为完全面向对象而不是开发人员的方式.简而言之,使用它开发感觉很自然,就像它是PHP开发的"方式"一样.
这是一个"由社区,为社区"建立的框架,而不是用于促销目的.不是为了任何社区,而是为了一个非常好的社区.
CodeIgniter在PHP4上停留了太长时间.看看CI2s的来源,我不能说他们已经完全转向PHP5(假设PHP 5.1并不是真的...... PHP 5).我见过FuelPHP,它看起来更像是与Kohana的CI2混搭,而不是CI2分支,尽管我不得不说它肯定有潜力.
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个月.
Kohana的级联文件系统使扩展现有组件,甚至是供应商使用的组件变得非常容易.您可以覆盖应用程序/模块级别的所有内容,而无需考虑在任何地方手动设置包含/加载路径(因为所有文件和文件夹都遵循相同的约定).
有很多模块,包括Zend Framework.怎么样?简而言之,您甚至可以使用ZF或任何其他库作为Kohana应用程序内的模块.
除了所有社区构建的模块,每个Kohana安装包括几个几乎每个应用程序都可以受益的:
Auth 一个简单但功能非常强大的身份验证库.模块本身仅提供文件auth驱动程序,但启用ORM为我们提供了更强大的功能.
缓存 高速缓存库,包含最流行的缓存技术的驱动程序:APC,eAccelerator,文件,内存缓存,SQLite,Wincache和Xcache.它非常容易实现和更改(即使稍后更改缓存驱动程序也是一行的).
Codebench 如果您需要对某些代码进行基准测试,Codebench为您提供了一种非常简单的方法.
数据库 与Kohana中的其他所有内容一样,数据库模块也完全面向对象且可扩展.附带完整的MySQL和PDO支持.
Image 一个简单的模块,便于图像处理
ORM 默认ORM基于ActiveRecord模式,充分利用了Database模块结合PHP 5魔术方法的优势.除了这个,您可以使用Jelly,Sprig,AutoModeler或任何其他自定义PHP库,如Doctrine.
Unittest Kohana预装了一个很棒的单元测试模块.它基于PHPUnit并与您的应用程序完全"集成",让您轻松实现TDD.此外,整个框架都经过单元测试.
用户指南 Altough被大多数开发人员忽略了,这个模块是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();
        }
    }
}
其中,illegal()可以是一些带有花哨的连接和东西的自定义模型级方法.我知道这个块看起来效率低,它只是一个代码示例,而不是"JOIN比其他查询更好":)
| 归档时间: | 
 | 
| 查看次数: | 8989 次 | 
| 最近记录: |