用 Composer构建自己的 PHP 框架之使用 ORM


Posted in PHP onOctober 30, 2014

回顾

经过前三篇文章 基础准备 、 构建路由 和 设计 MVC ,我们已经得到了一个结构比较完整的 MVC 架构的 PHP 微框架,但是距离一个真正能够上手使用的框架还差一样东西: 数据库封装 ,本篇就将讲述如何集成一个 ORM Composer 包 。

本篇是本系列最后一篇,接下来我可能会以 让我们开了又开的 Composer 包 为系列标题分享一些体验和感悟,将主要发表在本站上。

正文

我们选择 Laravel 的 illuminate/database 作为我们的 ORM 包。我试用了几个著名的 ORM,发现还是 Laravel 的 Eloquent 好用!让我们开心的 ORM,开了又开! :-D

在本系列教程里,每一个 Composer 包都要满足以下基本要求:

原生依赖 Composer 进行管理
在好用的基础上尽量简单(比如我们那个超简单的路由包)
尽量新,用上 PHP 的新特性

说到 PHP 的新特性,有句题外话。 PHP5.3 引入了命名空间,这是规划在 PHP6 中的功能,所以 PHP5.3 在一定程度上其实就是 PHP6 ,PHP 的下一个版本是 PHP7 ,即将发布,主要贡献者是大名鼎鼎的 鸟哥 @Laruence 。另外本台前方记者(就是我)刚刚从微博发来报道,鸟哥正在放大招,制造传说中 PHP7 on JIT ,我大 PHP 的历史车轮是无法阻挡的哈哈哈!:-P

安装 illuminate/database

给 composer.json 增加一个 require 项:

"illuminate/database": "*"
运行 composer update ,等待安装完成。

使用 Eloquent

修改 public/index.php 为:

<?php
use Illuminate\Database\Capsule\Manager as Capsule;
// Autoload 自动载入
require '../vendor/autoload.php';
// Eloquent ORM
$capsule = new Capsule;
$capsule->addConnection(require '../config/database.php');
$capsule->bootEloquent();
// 路由配置
require '../config/routes.php';

新增 config/database.php (注意替换数据库密码):

<?php
return [
  'driver'    => 'mysql',
  'host'      => 'localhost',
  'database'  => 'mffc',
  'username'  => 'root',
  'password'  => 'password',
  'charset'   => 'utf8',
  'collation' => 'utf8_general_ci',
  'prefix'    => ''
  ];

修改 models/Article.php :

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

controllers/HomeController.php 无需改动。

刷新,页面依旧:

用 Composer构建自己的 PHP 框架之使用 ORM

恭喜你!Eloquent 使用成功!

Eloquent 更多用法

Eloquent 异常强大 ,可以说是 Laravel 中 最特别 、 最有价值 的部分。
像 HomeController 中调用的 Article::first() ,之前用了十几行代码,现在什么都不用干,继承一个类就行了。

Eloquent 更多用法参见:Eloquent ORM 中文文档

其他著名 ORM

还有很多著名的 ORM 和 Datamapping(数据库迁移等) 包,参见: ORM and Datamapping

ORM 能够大幅提高提高开发效率,Eloquent 真乃神器也!
虽然 web 届各语言阵营都在不断推出新的所谓 快速开发框架 ,终归还是越来越像 Rails 。Eloquent 在表面上几乎是最像 Rails 的 ORM 的了,但是跟 Rails 不能比啊,Ruby 的超强面向对象特性可不是盖的。Laravel 作者 Taylor Otwell 接受采访时曾表示,Eloquent 是整个 Laravel 中最难实现的部分。我在调试的时候也发现, MFFC/vendor/illuminate/database/Illuminate/Database/Eloquent/Model.php 这个文件有 3000 多行......

目前建造一个丰满的可以上手使用的 PHP 框架的工作就算是基本完成了,接下来我会继续完善 MFFC 框架,让她更加丰富、好用!

以后可能会有 模板引擎、表单验证、发送邮件、权限体系管理、异步队列、视频音频处理(乱入:-D) 等内容,敬请关注还未出世的 让我们开了又开的 Composer 包 系列文章。

谢谢大家的阅读和陪伴!再见!

PHP 相关文章推荐
社区(php&amp;&amp;mysql)一
Oct 09 PHP
用PHP即时捕捉PHP中的错误并发送email通知的实现代码
Jan 19 PHP
深入eAccelerator与memcached的区别详解
Jun 06 PHP
使用php将某个目录下面的所有文件罗列出来的方法详解
Jun 21 PHP
php实现猴子选大王问题算法实例
Apr 20 PHP
10条php编程小技巧
Jul 07 PHP
PHP+swoole实现简单多人在线聊天群发
Jan 19 PHP
Linux平台php命令行程序处理管道数据的方法
Nov 10 PHP
Laravel框架路由管理简单示例
May 07 PHP
Laravel5.1框架注册中间件的三种场景详解
Jul 09 PHP
基于php伪静态的实现方法解析
Jul 31 PHP
PHP基于ip2long实现IP转换整形
Dec 11 PHP
用 Composer构建自己的 PHP 框架之设计 MVC
Oct 30 #PHP
用 Composer构建自己的 PHP 框架之构建路由
Oct 30 #PHP
ThinkPHP做文字水印时提示call an undefined function exif_imagetype()解决方法
Oct 30 #PHP
用 Composer构建自己的 PHP 框架之基础准备
Oct 30 #PHP
thinkphp视图模型查询提示ERR: 1146:Table 'db.pr_order_view' doesn't exist的解决方法
Oct 30 #PHP
仿dedecms下拉分页样式修改的thinkphp分页类实例
Oct 30 #PHP
thinkphp中html:list标签传递多个参数实例
Oct 30 #PHP
You might like
php长字符串定义方法
2012/07/12 PHP
如何给phpcms v9增加类似于phpcms 2008中的关键词表
2013/07/01 PHP
简单的php新闻发布系统教程
2014/05/09 PHP
PHP实现重载的常用方法实例详解
2017/10/18 PHP
php中file_get_contents()函数用法实例
2019/02/21 PHP
Laravel 添加多语言提示信息的方法
2019/09/29 PHP
THREE.JS入门教程(4)创建粒子系统
2013/01/24 Javascript
简单的代码实现jquery定时器
2013/11/17 Javascript
无限树Jquery插件zTree的常用功能特性总结
2014/09/11 Javascript
JavaScript实现基于Cookie的存储类实例
2015/04/10 Javascript
原生js编写autoComplete插件
2016/04/13 Javascript
jQuery绑定事件on()与弹窗的简要概述
2016/04/27 Javascript
JS 实现计算器详解及实例代码(一)
2017/01/08 Javascript
js实现彩色条纹滚动条效果
2017/03/15 Javascript
基于Vue实例生命周期(全面解析)
2017/08/16 Javascript
jQuery zTree搜索-关键字查询 递归无限层功能实现代码
2018/01/25 jQuery
vue的三种图片引入方式代码实例
2019/11/19 Javascript
微信小程序音乐播放器开发
2019/11/20 Javascript
微信小程序canvas开发水果老虎机的思路详解
2020/02/07 Javascript
加速vue组件渲染之性能优化
2020/04/09 Javascript
es6数组之扩展运算符操作实例分析
2020/04/25 Javascript
JavaScript实现随机点名小程序
2020/10/29 Javascript
[34:44]Liquid vs TNC Supermajor 胜者组 BO3 第二场 6.4
2018/06/05 DOTA
Python DataFrame 设置输出不显示index(索引)值的方法
2018/06/07 Python
Python qrcode 生成一个二维码的实例详解
2020/02/12 Python
Python2.x与3​​.x版本有哪些区别
2020/07/09 Python
Python pip使用超时问题解决方案
2020/08/03 Python
python PyAUtoGUI库实现自动化控制鼠标键盘
2020/09/09 Python
俄罗斯Sportmarket体育在线商店:用于旅游和户外活动
2019/11/12 全球购物
专业幼师实习生自我鉴定范文
2013/12/08 职场文书
园林毕业生自我鉴定范文
2013/12/29 职场文书
镇政府副镇长群众路线专题民主生活会对照检查材料
2014/09/19 职场文书
教你如何使用Python下载B站视频的详细教程
2021/04/29 Python
详解PHP用mb_string处理windows中文字符
2021/05/26 PHP
python函数的两种嵌套方法使用
2022/04/02 Python
PostgreSQL常用字符串分割函数整理汇总
2022/07/07 PostgreSQL