用 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调用Java对象的方法
Oct 09 PHP
防止MySQL注入或HTML表单滥用的PHP程序
Jan 21 PHP
解析PHP实现多进程并行执行脚本
Jun 18 PHP
基于PHP中的常用函数回顾
Jul 11 PHP
destoon二次开发入门示例
Jun 20 PHP
ThinkPHP分页实例
Oct 15 PHP
Yii实现MySQL多数据库和读写分离实例分析
Dec 03 PHP
php实现图片等比例缩放代码
Jul 23 PHP
PHP实现数组转JSon和JSon转数组的方法示例
Jun 14 PHP
PHP实现的DES加密解密类定义与用法示例
Nov 02 PHP
php输出控制函数和输出函数生成静态页面
Jun 27 PHP
laravel 输出最后执行sql 附:whereIn的使用方法
Oct 10 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自动生成月历代码
2006/10/09 PHP
强烈推荐:php.ini中文版(2)
2006/10/09 PHP
php 执行系统命令的方法
2009/07/07 PHP
php中global和$GLOBALS[]的分析之一
2012/02/02 PHP
捕获关闭窗口的脚本
2009/01/10 Javascript
Javascript中定义方法的另类写法(批量定义js对象的方法)
2011/02/25 Javascript
JavaScript中圆括号()和方括号[]的特殊用法疑问解答
2013/08/06 Javascript
jQuery+ajax实现鼠标单击修改内容的思路
2014/06/29 Javascript
javascript数组详解
2014/10/22 Javascript
jQuery带箭头提示框tooltips插件集锦
2014/11/17 Javascript
总结JavaScript中布尔操作符||与&amp;&amp;的使用技巧
2015/11/17 Javascript
轻松学习jQuery插件EasyUI EasyUI实现树形网络基本操作(2)
2015/11/30 Javascript
使用jQuery监听DOM元素大小变化
2016/02/24 Javascript
详谈Ajax请求中的async:false/true的作用(ajax 在外部调用问题)
2017/02/10 Javascript
Vuex之理解Getters的用法实例
2017/04/19 Javascript
AngularJS 控制器 controller的详解
2017/10/17 Javascript
js 毫秒转天时分秒的实例
2017/11/17 Javascript
JavaScript运行原理分析
2018/02/09 Javascript
详解vue通过NGINX部署在子目录或者二级目录实践
2018/09/03 Javascript
详解async/await 异步应用的常用场景
2019/05/13 Javascript
[48:37]EG vs OG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Django与遗留的数据库整合的方法指南
2015/07/24 Python
Python代码实现删除一个list里面重复元素的方法
2019/04/02 Python
python对象与json相互转换的方法
2019/05/07 Python
Python爬虫库requests获取响应内容、响应状态码、响应头
2020/01/25 Python
使用tensorflow实现矩阵分解方式
2020/02/07 Python
Pyqt5 关于流式布局和滚动条的综合使用示例代码
2020/03/24 Python
Python selenium实现断言3种方法解析
2020/09/08 Python
英国工作场所设备购买网站:Slingsby
2019/05/03 全球购物
假日旅行社实习自我鉴定
2013/09/24 职场文书
办公室副主任职责范本
2014/03/08 职场文书
养生餐厅创业计划书范文
2014/03/26 职场文书
2015年妇联工作总结范文
2015/04/22 职场文书
Python带你从浅入深探究Tuple(基础篇)
2021/05/15 Python
详解CSS3.0(Cascading Style Sheet) 层叠级联样式表
2021/07/16 HTML / CSS
centos环境下nginx高可用集群的搭建指南
2022/07/23 Servers