给 CI 插上翅膀——在 CodeIgniter 2 中使用 Laravel Eloquent ORM

分享 johnlui ⋅ 于 3年前 ⋅ 最后回复由 Legend 3年前 ⋅ 10883 阅读

说明

原文发表在我的个人网站:给 CI 插上翅膀——在 CodeIgniter 2 中使用 Laravel Eloquent ORM

本教程示例代码见 https://github.com/johnlui/CodeIgniter-2-with-Eloquent

背景介绍

CodeIgniter 框架和 Laravel 框架基本可以看做是之前若干年和这两年的 PHP 框架霸主,使用率和出镜率最高的框架。

CI 是一个轻型框架,只提供了 路由、MVC 分离、视图加载器、Active Record 等一些基本功能,但这恰恰是其使用率高的原因:提供的东西少而精,适用于绝大多数场景。CI 的文档堪称开源软件的典范,非常之清晰、详尽,对新手非常友好,十分容易上手。

Laravel 是这两年刚刚兴起的重型全功能框架,可以极大地提高开发效率,但是 Laravel 4 的文档并没有 3 那么清晰,中文资料也非常少,很多人在学习的时候遇到了比较大的困难。例如复杂的路由系统让很多用惯了 CI 自动映射的人无所适从,文档又只有寥寥几句话,导致相当一部分人被拦在了使用框架的第一步,学习的热情也被浇灭。

我前段时间写了系列教程 Laravel 4 系列入门教程【最适合中国人的Laravel教程】,访问量和反响都还不错,需要的人可以看看。

繁琐的路由让很多人怀念 CI 的自动映射,繁重的框架基础工作(一个 Hello World 页面需要载入 150 多个文件)也让 Laravel 的性能在一些场景下不能满足要求。很多人用了一段时间后发现,Laravel 中的 Eloquent ORM 是跟 CI 比最强大的地方,于是就想把 Eloquent 移植到 CI 上,我以前也想过,无奈实力不够无从下手。现在终于知道怎么搞了,下面我们正式开始。

基础准备

PHP 版本要求 >= 5.4,这是 Eloquent 的最低要求。

下载 CodeIgniter 2.2.0,地址是 http://www.codeigniter.com/download,下载完成后解压到某个地方,配置好 HTTP 服务软件,把网站跑起来。如果你已经看到了以下画面,就可以继续往下做了: pic

开始嫁接

我们使用 Composer 来载入和管理 Eloquent。Composer 会生成一个自动加载(autoload)文件,我们只需要 require 这个文件,就可以使用所有通过 Composer 安装的包。现在我们要在 CodeIgniter 项目中使用 Composer,在其根目录下新建 composer.json:

{
  "require": {
    "php": ">=5.4.0",
    "illuminate/database": "*"
  },
}

然后运行 composer update,稍等片刻,Composer 体系创建完成,同时 illuminate/database 包也已经安装完成。

然后新建 application/third_party/eloquent.php

<?php

defined('BASEPATH') OR exit('No direct script access allowed');

use Illuminate\Database\Capsule\Manager as Capsule;

// Autoload 自动载入
require BASEPATH.'../vendor/autoload.php';

// 载入数据库配置文件
require_once APPPATH.'config/database.php';

// Eloquent ORM
$capsule = new Capsule;

$capsule->addConnection($db['eloquent']);

$capsule->bootEloquent();

这个文件将会帮我们引入 Composer 的自动加载文件,同时会帮我们初始化 Eloquent,这个文件载入了一个数据库配置文件,在 application/config/database.php 的最后新增(注意替换数据库名称和密码):

$db['eloquent'] = [
  'driver'    => 'mysql',
  'host'      => 'localhost',
  'database'  => 'ci',
  'username'  => 'root',
  'password'  => 'password',
  'charset'   => 'utf8',
  'collation' => 'utf8_general_ci',
  'prefix'    => ''
  ];

接下来我么需要在 CI 应用启动的时候引入上面那个文件,在最外面的 index.php 的后部增加:

/*
 * --------------------------------------------------------------------
 * LOAD Laravel Eloquent ORM
 * --------------------------------------------------------------------
 *
 */

require APPPATH.'third_party/eloquent.php';

注意,这段代码一定要放在 require_once BASEPATH.'core/CodeIgniter.php'; 这一行的 前面

然后,开始使用 Eloquent,修改 application/controllers/welcome.php 中的 index() 为:

public function index()
{
    $data['article'] = Article::first();
    $this->load->view('home', $data);
}

新建 application/views/home.php 文件:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>CI2 with Eloquent</title>
</head>
<body>

  <h1>
    <?php echo $article->title; ?>
  </h1>
  <div class="content">
    <p>
      <?php echo $article->content; ?>
    </p>
  </div>

</body>
</html>

现在让我们向数据库中填充需要使用的数据,运行 SQL 语句:

DROP TABLE IF EXISTS `articles`;

CREATE TABLE `articles` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(255) DEFAULT NULL,
  `content` longtext,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

LOCK TABLES `articles` WRITE;
/*!40000 ALTER TABLE `articles` DISABLE KEYS */;

INSERT INTO `articles` (`id`, `title`, `content`)
VALUES
    (1,'我是标题','<h3>我是内容呀~~</h3><p>我真的是内容,不信算了,哼~ O(∩_∩)O</p>'),
    (2,'我是标题','<h3>我是内容呀~~</h3><p>我真的是内容,不信算了,哼~ O(∩_∩)O</p>');

/*!40000 ALTER TABLE `articles` ENABLE KEYS */;
UNLOCK TABLES;

然后建立模型,新建 application/models/Article.php 文件:

<?php

defined('BASEPATH') OR exit('No direct script access allowed');

/**
* Article Model
*/
class Article extends Illuminate\Database\Eloquent\Model
{
  public $timestamps = false;
}

最后,修改 composer.json 将 models 文件夹加入自动加载:

{
    "require": {
        "php": ">=5.4.0",
    "illuminate/database": "*"
    },
  "autoload": {
    "classmap": [
      "application/models"
    ]
  }
}

运行 composer dump-autoload,刷新页面!你将看到以下画面:

pic

恭喜你!Eloquent 嫁接到 CodeIgniter 2 成功!

CodeIgniter 3 正处于 DEV 阶段,原生支持 Composer,可以直接修改 composer.json 文件,配置方式和 2 完全一致。

资源汇总

  1. CodeIgniter 2 with Eloquent,GitHub 地址:https://github.com/johnlui/CodeIgniter-2-with-Eloquent
  2. 利用 Composer 一步一步构建自己的 PHP 框架(四)——使用 ORM
  3. Eloquent 中文文档
  4. Download CodeIgniter
  5. illuminate/database
本帖已被设为精华帖!
成为第一个点赞的人吧 :bowtie:
回复数量: 7
  • duke-lee 2
    3年前

    繁琐的路由让很多人怀念 CI 的自动映射

    这个可以使用 Route:controller 实现.

    Laravel 的性能在一些场景下不能满足要求

    CI 和 Laravel 不同的是, Laravel 是 Full Stack 框架, 重在开发效率, 类似于 Rails, Rails 在一开始也有一堆人在说效率问题, 但是, 实践证明, 在选择框架的时候讨论运行效率, 没多大意义, 你说的 场景 如果是指高负载的情况的话, Twitter, Github, Facebook 都已经证明了- 运行效率 Is never a problem.

    关于 性能 这一点, 我认为, 应该是系统架构上的问题, 不应该在框架上做太多考虑, 如果真的需要代码级别的运行效率, 使用 PHP 可能从一开始就不是很明智的选择, 大可选择 Assembly, C, C++ 等底层语言.

  • duke-lee
    3年前

    文章写的很不错, 不是来抬杠的呀, 哈哈, 就是发表下自己的观点. 赞一下好文章 :+1:

  • johnlui
    3年前

    @duke-lee 多写一个get还是不一样。。。

  • Summer MOD A Life-long learner.
    3年前

    测试域名不错 :smile:

  • johnlui
    3年前

    @Summer :joy: :joy:

  • lijinma 就喜欢折腾。
    3年前

    @duke-lee 很赞的观点~嘿嘿

  • Legend
    3年前

    不错的尝试,composer绝对是个好东西。

暂无评论~~

  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!