用 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防注
Jan 15 PHP
php桌面中心(一) 创建数据库
Mar 11 PHP
Windows PHP5和Apache的安装与配置
Jun 08 PHP
php addslashes及其他清除空格的方法是不安全的
Jan 25 PHP
php可扩展的验证类实例(可对邮件、手机号、URL等验证)
Jul 09 PHP
详解PHP错误日志的获取方法
Jul 20 PHP
详解PHP对数组的定义以及数组的创建方法
Nov 27 PHP
Zend Framework教程之路由功能Zend_Controller_Router详解
Mar 07 PHP
PHP中strpos、strstr和stripos、stristr函数分析
Jun 11 PHP
PHP图片裁剪与缩放示例(无损裁剪图片)
Feb 08 PHP
PHP实现浏览器格式化显示XML的方法示例
Jan 22 PHP
阿里对象存储OSS在laravel框架中的使用方法
Oct 13 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
多人战的战术与战略
2020/03/04 星际争霸
文件上传类
2006/10/09 PHP
php生成的html meta和link标记在body标签里 顶部有个空行
2010/05/18 PHP
codeigniter数据库操作函数汇总
2014/06/12 PHP
PHP中上传多个文件的表单设计例子
2014/11/19 PHP
PHP文件缓存类示例分享
2015/01/30 PHP
ThinkPHP框架安全实现分析
2016/03/14 PHP
php如何执行非缓冲查询API
2016/07/22 PHP
PHP执行shell脚本运行程序不产生core文件的方法
2016/12/28 PHP
详解cookie验证的php应用的一种SSO解决办法
2017/10/20 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
2017/11/14 PHP
JavaScript中的事件处理
2008/01/16 Javascript
javascript 三种编解码方式
2010/02/01 Javascript
DIV+CSS+JS不间断横向滚动实现代码
2013/03/19 Javascript
javascript实现详细时间提醒信息效果的方法
2015/03/11 Javascript
JS判断是否长按某一键的方法
2016/03/02 Javascript
Bootstrap Navbar Component实现响应式导航
2016/10/08 Javascript
Js判断H5上下滑动方向及滑动到顶部和底部判断的示例代码
2017/11/15 Javascript
微信小程序scroll-x失效的完美解决方法
2018/07/18 Javascript
webpack中如何使用雪碧图的示例代码
2018/11/11 Javascript
vue的路由映射问题及解决方案
2019/10/14 Javascript
JS绘图Flot应用图形绘制异常解决方案
2020/10/16 Javascript
pandas groupby 分组取每组的前几行记录方法
2018/04/20 Python
Python加载带有注释的Json文件实例
2018/05/23 Python
在PyCharm中实现关闭一个死循环程序的方法
2018/11/29 Python
Python 类的魔法属性用法实例分析
2019/11/21 Python
python db类用法说明
2020/07/07 Python
python 无损批量压缩图片(支持保留图片信息)的示例
2020/09/22 Python
python调用百度AI接口实现人流量统计
2021/02/03 Python
详解HTML5将footer置于页面最底部的方法(CSS+JS)
2018/10/11 HTML / CSS
Booking.com缤客中国:全球酒店在线预订网站
2020/05/03 全球购物
会计主管岗位职责
2014/01/03 职场文书
食品安全标语
2014/06/07 职场文书
化学教育专业自荐信
2014/07/04 职场文书
公司奖励通知
2015/04/21 职场文书
大学生心理健康活动总结
2015/05/08 职场文书