了解知识
背景介绍
CodeIgniter 框架和 Laravel 框架基本可以看做是之前若干年和这两年的 PHP 框架霸主,使用率和出镜率最高的框架。
 
CI 是一个轻型框架,只提供了 路由、MVC 分离、视图加载器、Active Record 等一些基本功能,但这恰恰是其使用率高的原因:提供的东西少而精,适用于绝大多数场景。CI 的文档堪称开源软件的典范,非常之清晰、详尽,对新手非常友好,十分容易上手。
 
Laravel 是这两年刚刚兴起的重型全功能框架,可以极大地提高开发效率,但是 Laravel 4 的文档并没有 3 那么清晰,中文资料也非常少,很多人在学习的时候遇到了比较大的困难。例如复杂的路由系统让很多用惯了 CI 自动映射的人无所适从,文档又只有寥寥几句话,导致相当一部分人被拦在了使用框架的第一步,学习的热情也被浇灭。
 
繁琐的路由让很多人怀念 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 服务软件,把网站跑起来。如果你已经看到了以下画面,就可以继续往下做了。
 
开始嫁接
我们使用 Composer 来载入和管理 Eloquent。Composer 会生成一个自动加载(autoload)文件,我们只需要 require这个文件,就可以使用所有通过 Composer 安装的包。现在我们要在 CodeIgniter 项目中使用 Composer,在其根目录下新建 composer.json:
 
 
  1.   "require": { 
  2.     "php"">=5.4.0"
  3.     "illuminate/database""*" 
  4.   }, 
然后运行 composer update,稍等片刻,Composer 体系创建完成,同时 illuminate/database 包也已经安装完成。
 
然后新建 application/third_party/eloquent.php:
 
  1. <?php 
  2.  
  3. defined('BASEPATH') OR exit('No direct script access allowed'); 
  4.  
  5. use Illuminate\Database\Capsule\Manager as Capsule; 
  6.  
  7. // Autoload 自动载入 
  8. require BASEPATH.'../vendor/autoload.php'
  9.  
  10. // 载入数据库配置文件 
  11. require_once APPPATH.'config/database.php'
  12.  
  13. // Eloquent ORM 
  14. $capsule = new Capsule; 
  15.  
  16. $capsule->addConnection($db['eloquent']); 
  17.  
  18. $capsule->bootEloquent(); 
 
 
这个文件将会帮我们引入 Composer 的自动加载文件,同时会帮我们初始化 Eloquent,这个文件载入了一个数据库配置文件,在 `application/config/database.php` 的最后新增(注意替换数据库名称和密码):
 
 
  1. $db['eloquent'] = [ 
  2.   'driver'    => 'mysql'
  3.   'host'      => 'localhost'
  4.   'database'  => 'ci'
  5.   'username'  => 'root'
  6.   'password'  => 'password'
  7.   'charset'   => 'utf8'
  8.   'collation' => 'utf8_general_ci'
  9.   'prefix'    => '' 
  10.   ]; 
 
 
接下来我么需要在 CI 应用启动的时候引入上面那个文件,在最外面的 `index.php` 的后部增加:
 
 
  1. /* 
  2.  * -------------------------------------------------------------------- 
  3.  * LOAD Laravel Eloquent ORM 
  4.  * -------------------------------------------------------------------- 
  5.  * 
  6.  */ 
  7.  
  8. require APPPATH.'third_party/eloquent.php'
 
 
> 注意,这段代码一定要放在 `require_once BASEPATH.'core/CodeIgniter.php';` 这一行的 ***前面***!
 
然后,开始使用 Eloquent,修改 `application/controllers/welcome.php` 中的 `index()` 为:
 
 
  1. public function index() 
  2.     $data['article'] = Article::first(); 
  3.     $this->load->view('home'$data); 
 
 
新建 `application/views/home.php` 文件:
 
  1. <!DOCTYPE html> 
  2. <html lang="en"
  3. <head> 
  4.   <meta charset="UTF-8"
  5.   <title>CI2 with Eloquent</title> 
  6. </head> 
  7. <body> 
  8.  
  9.   <h1> 
  10.     <?php echo $article->title; ?> 
  11.   </h1> 
  12.  
  13.  
  14. <div class="content"
  15.     <p> 
  16.       <?php echo $article->content; ?> 
  17.     </p> 
  18.   </div> 
  19.  
  20.  
  21.  
  22. </body> 
  23. </html> 
现在让我们向数据库中填充需要使用的数据,运行 SQL 语句:
 
 
  1. DROP TABLE IF EXISTS `articles`; 
  2.  
  3. CREATE TABLE `articles` ( 
  4.   `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
  5.   `title` varchar(255) DEFAULT NULL
  6.   `content` longtext, 
  7.   PRIMARY KEY (`id`) 
  8. ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
  9.  
  10. LOCK TABLES `articles` WRITE; 
  11. /*!40000 ALTER TABLE `articles` DISABLE KEYS */; 
  12.  
  13. INSERT INTO `articles` (`id`, `title`, `content`) 
  14. VALUES 
  15.     (1,'我是标题',' 
  16.  
  17. <h3>我是内容呀~~</h3> 
  18.  
  19.  
  20.  
  21. <p>我真的是内容,不信算了,哼~ O(∩_∩)O</p> 
  22.  
  23. '), 
  24.     (2,'我是标题',' 
  25.  
  26. <h3>我是内容呀~~</h3> 
  27.  
  28.  
  29.  
  30. <p>我真的是内容,不信算了,哼~ O(∩_∩)O</p> 
  31.  
  32. '); 
  33.  
  34. /*!40000 ALTER TABLE `articles` ENABLE KEYS */; 
  35. UNLOCK TABLES; 
然后建立模型,新建 application/models/Article.php 文件:
 
 
  1. <?php 
  2.  
  3. defined('BASEPATH') OR exit('No direct script access allowed'); 
  4.  
  5. /** 
  6. * Article Model 
  7. */ 
  8. class Article extends Illuminate\Database\Eloquent\Model 
  9.   public $timestamps = false; 
最后,修改 composer.json 将 models 文件夹加入自动加载:
 
 
  1.     "require": { 
  2.         "php"">=5.4.0"
  3.     "illuminate/database""*" 
  4.     }, 
  5.   "autoload": { 
  6.     "classmap": [ 
  7.       "application/models" 
  8.     ] 
  9.   } 
运行 composer dump-autoload,刷新页面!你将看到以下画面:
 
 
 
恭喜你!Eloquent 嫁接到 CodeIgniter 2 成功!
 
CodeIgniter 3 正处于 DEV 阶段,原生支持 Composer,可以直接修改 composer.json 文件,配置方式和 2 完全一致。
标签: CI框架 codeigniter
扩展知识