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

說明

原文發表在個人我的網站:給 CI 插上翅膀——在 CodeIgniter 2 中使用 Laravel Eloquent ORMphp

本教程示例代碼見 https://github.com/johnlui/CodeIgniter-2-with-Eloquenthtml

背景介紹

CodeIgniter 框架和 Laravel 框架基本能夠看作是以前若干年和這兩年的 PHP 框架霸主,使用率和出鏡率最高的框架。mysql

CI 是一個輕型框架,只提供了 路由、MVC 分離、視圖加載器、Active Record 等一些基本功能,但這偏偏是其使用率高的緣由:提供的東西少而精,適用於絕大多數場景。CI 的文檔堪稱開源軟件的典範,很是之清晰、詳盡,對新手很是友好,十分容易上手。laravel

Laravel 是這兩年剛剛興起的重型全功能框架,能夠極大地提升開發效率,可是 Laravel 4 的文檔並無 3 那麼清晰,中文資料也很是少,不少人在學習的時候遇到了比較大的困難。例如複雜的路由系統讓不少用慣了 CI 自動映射的人無所適從,文檔又只有寥寥幾句話,致使至關一部分人被攔在了使用框架的第一步,學習的熱情也被澆滅。git

我前段時間寫了系列教程 Laravel 4 系列入門教程【最適合中國人的Laravel教程】,訪問量和反響都還不錯,須要的人能夠看看。github

繁瑣的路由讓不少人懷念 CI 的自動映射,繁重的框架基礎工做(一個 Hello World 頁面須要載入 150 多個文件)也讓 Laravel 的性能在一些場景下不能知足要求。不少人用了一段時間後發現,Laravel 中的 Eloquent ORM 是跟 CI 比最強大的地方,因而就想把 Eloquent 移植到 CI 上,我之前也想過,無奈實力不夠無從下手。如今終於知道怎麼搞了,下面咱們正式開始。sql

基礎準備

PHP 版本要求 >= 5.4,這是 Eloquent 的最低要求。數據庫

下載 CodeIgniter 2.2.0,地址是 http://www.codeigniter.com/download,下載完成後解壓到某個地方,配置好 HTTP 服務軟件,把網站跑起來。若是你已經看到了如下畫面,就能夠繼續往下作了:
picjson

開始嫁接

咱們使用 Composer 來載入和管理 Eloquent。Composer 會生成一個自動加載(autoload)文件,咱們只須要 require 這個文件,就能夠使用全部經過 Composer 安裝的包。如今咱們要在 CodeIgniter 項目中使用 Composer,在其根目錄下新建 composer.json:app

{
  "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` 的最後新增(注意替換數據庫名稱和密碼):

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

接下來我麼須要在 CI 應用啓動的時候引入上面那個文件,在最外面的 `index.php` 的後部增長:

```php
/*
 * --------------------------------------------------------------------
 * LOAD Laravel Eloquent ORM
 * --------------------------------------------------------------------
 *
 */

require APPPATH.'third_party/eloquent.php';
```

> 注意,這段代碼必定要放在 `require_once BASEPATH.'core/CodeIgniter.php';` 這一行的 ***前面***!

而後,開始使用 Eloquent,修改 `application/controllers/welcome.php` 中的 `index()` 爲:

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

新建 `application/views/home.php` 文件:
```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
相關文章
相關標籤/搜索