用 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
11个PHPer必须要了解的编程规范
Sep 22 PHP
Apache启动报错No space left on device: AH00023该怎么解决
Oct 16 PHP
使用PHP uniqid函数生成唯一ID
Nov 18 PHP
PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
Feb 15 PHP
实例讲解如何在PHP的Yii框架中进行错误和异常处理
Mar 17 PHP
PHP入门教程之上传文件实例详解
Sep 11 PHP
PHP中获取文件创建日期、修改日期、访问时间的方法
Nov 05 PHP
PHP 类与构造函数解析
Feb 06 PHP
PHP 获取指定地区的天气实例代码
Feb 08 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
Nov 14 PHP
PHP 范围解析操作符(::)用法分析【访问静态成员和类常量】
Apr 14 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
Syphon 秘笈
2021/03/03 冲泡冲煮
如何对PHP程序中的常见漏洞进行攻击(上)
2006/10/09 PHP
PHP最常用的ini函数分析 针对PHP.ini配置文件
2010/04/22 PHP
兼容ie6浏览器的php下载文件代码分享
2014/07/14 PHP
php查询相似度最高的字符串的方法
2015/03/12 PHP
smarty模板引擎之分配数据类型
2015/03/30 PHP
PHP开启opcache提升代码性能
2015/04/26 PHP
PHP PDOStatement::getColumnMeta讲解
2019/02/01 PHP
Alliance vs Liquid BO3 第二场2.13
2021/03/10 DOTA
说明你的Javascript技术很烂的五个原因
2011/04/26 Javascript
jQuery实现表头固定效果的实例代码
2013/05/24 Javascript
js(JavaScript)实现TAB标签切换效果的简单实例
2014/02/26 Javascript
使用jquery组件qrcode生成二维码及应用指南
2015/02/22 Javascript
基于Css3和JQuery实现打字机效果
2015/08/11 Javascript
微信小程序实现给循环列表添加点击样式实例
2017/04/26 Javascript
JavaScript同源策略和跨域访问实例详解
2018/04/03 Javascript
基于jQuery使用Ajax动态执行模糊查询功能
2018/07/05 jQuery
react native 获取地理位置的方法示例
2018/08/28 Javascript
通过扫小程序码实现网站登陆功能
2019/08/22 Javascript
Vue程序化的事件监听器(实例方案详解)
2020/01/07 Javascript
基于vue3.0.1beta搭建仿京东的电商H5项目
2020/05/06 Javascript
浅谈JavaScript中this的指向更改
2020/07/28 Javascript
Vue通过provide inject实现组件通信
2020/09/03 Javascript
numpy.meshgrid()理解(小结)
2019/08/01 Python
使用jupyter Nodebook查看函数或方法的参数以及使用情况
2020/04/14 Python
为什么称python为胶水语言
2020/06/16 Python
基于OpenCV的网络实时视频流传输的实现
2020/11/15 Python
La Redoute英国官网:法国时尚品牌
2017/04/27 全球购物
Lookfantastic台湾:英国彩妆美发保养购物网
2018/03/26 全球购物
英国百年闻名的优质健康产品连锁店:Holland & Barrett
2019/12/19 全球购物
初中生三年学习生活的自我评价
2013/11/03 职场文书
小学班级口号
2014/06/09 职场文书
预备党员对照检查材料思想汇报
2014/09/24 职场文书
个人批评与自我批评
2014/10/15 职场文书
WINDOWS 64位 下安装配置mysql8.0.25最详细的教程
2022/03/22 MySQL
Python如何让字典保持有序排列
2022/04/29 Python