用 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开发大型项目的一点经验
Oct 09 PHP
PHP+APACHE实现用户论证的方法
Oct 09 PHP
mysq GBKl乱码
Nov 28 PHP
php计算几分钟前、几小时前、几天前的几个函数、类分享
Apr 09 PHP
PHP中数组的分组排序实例
Jun 01 PHP
PHP中file_exists函数不支持中文名的解决方法
Jul 26 PHP
php编写简单的文章发布程序
Jun 18 PHP
PHP简单实现断点续传下载的方法
Sep 25 PHP
php使用ffmpeg向视频中添加文字字幕的实现方法
May 23 PHP
PHP7如何开启Opcode打造强悍性能详解
May 11 PHP
原生PHP实现导出csv格式Excel文件的方法示例【附源码下载】
Mar 07 PHP
php ActiveMQ的安装与使用方法图文教程
Feb 23 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 $_SERVER windows系统与linux系统下的区别说明
2014/02/14 PHP
PHP生成短网址的3种方法代码实例
2014/07/08 PHP
php实现指定字符串中查找子字符串的方法
2015/03/17 PHP
在Windows系统下使用PHP生成Word文档的教程
2015/07/03 PHP
5个javascript的数字格式化函数分享
2011/12/07 Javascript
html5的自定义data-*属性和jquery的data()方法的使用示例
2013/08/21 Javascript
通过$(this)使用jQuery包装后的方法或属性
2014/05/18 Javascript
动态加载jQuery的两种方法实例分析
2015/07/17 Javascript
点击页面任何位置隐藏div的实现方法
2016/09/05 Javascript
JS不完全国际化&amp;本地化手册 之 理论篇
2016/09/27 Javascript
js中获取键盘事件的简单实现方法
2016/10/10 Javascript
vue中实现在外部调用methods的方法(推荐)
2018/02/08 Javascript
详解基于vue的服务端渲染框架NUXT
2018/06/20 Javascript
详解nuxt 微信公众号支付遇到的问题与解决
2019/08/26 Javascript
详解微信小程序(Taro)手动埋点和自动埋点的实现
2021/03/02 Javascript
[51:10]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python单例模式实例分析
2015/01/14 Python
简单谈谈python中的多进程
2016/11/06 Python
Python实现查找匹配项作处理后再替换回去的方法
2017/06/10 Python
对Python 文件夹遍历和文件查找的实例讲解
2018/04/26 Python
详解通过API管理或定制开发ECS实例
2018/09/30 Python
Pyqt5实现英文学习词典
2019/06/24 Python
python画图把时间作为横坐标的方法
2019/07/07 Python
浅析Python 引号、注释、字符串
2019/07/25 Python
python实现机器人卡牌
2019/10/06 Python
深入浅析Python 函数注解与匿名函数
2020/02/24 Python
python 密码学示例——凯撒密码的实现
2020/09/21 Python
Pycharm创建文件时自动生成文件头注释(自定义设置作者日期)
2020/11/24 Python
利用CSS3实现进度条的两种姿势详解
2017/03/21 HTML / CSS
浅谈css3中的渐进增强和优雅降级
2017/12/01 HTML / CSS
HTML5中input[type='date']自定义样式与日历校验功能的实现代码
2017/07/11 HTML / CSS
方法名是否可以与构造器的名字相同
2012/06/04 面试题
交通事故和解协议书
2015/01/27 职场文书
幼儿园大班开学寄语(2015秋季)
2015/05/27 职场文书
刮痧观后感
2015/06/05 职场文书
vue特效之翻牌动画
2022/04/20 Vue.js