用 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更新购物车数量(表单部分/PHP处理部分)
May 03 PHP
浅析php过滤html字符串,防止SQL注入的方法
Jul 02 PHP
php中autoload的用法总结
Nov 08 PHP
使用PHP导出Redis数据到另一个Redis中的代码
Mar 12 PHP
thinkphp区间查询、统计查询与SQL直接查询实例分析
Nov 24 PHP
php身份证号码检查类实例
Jun 18 PHP
Laravel5中防止XSS跨站攻击的方法
Oct 10 PHP
php判断是否连接上网络的方法实例详解
Dec 14 PHP
ThinkPHP框架分布式数据库连接方法详解
Mar 14 PHP
Laravel中错误与异常处理的用法示例
Sep 16 PHP
php实现对文件压缩简单的方法
Sep 29 PHP
PHP pthreads v3下同步处理synchronized用法示例
Feb 21 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类
2008/04/09 PHP
php导出word格式数据的代码实例
2013/11/25 PHP
Laravel框架数据库CURD操作、连贯操作总结
2014/09/03 PHP
PHP实现将视频转成MP4并获取视频预览图的方法
2015/03/12 PHP
用 JSON 处理缓存
2007/04/27 Javascript
在Windows上安装Node.js模块的方法
2011/09/25 Javascript
firefox下input type=&quot;file&quot;的size是多大
2011/10/24 Javascript
jquery异步跨域访问代码
2013/06/28 Javascript
js实现点小图看大图效果的思路及示例代码
2013/10/28 Javascript
jQuery自带的一些常用方法总结
2014/09/03 Javascript
js实现带关闭按钮始终显示在网页最底部工具条的方法
2015/03/02 Javascript
javascript基础语法学习笔记
2016/01/04 Javascript
jQuery轻松实现表格的隔行变色和点击行变色的实例代码
2016/05/09 Javascript
js判断复选框是否选中及选中个数的实现代码
2016/05/30 Javascript
JavaScript必看小技巧(必看)
2016/06/07 Javascript
jQuery自定义组件(导入组件)
2016/11/08 Javascript
浅谈js原生拖放
2016/11/21 Javascript
教你一步步用jQyery实现轮播器
2016/12/18 Javascript
jQuery实现可移动选项的左右下拉列表示例
2016/12/26 Javascript
vue 封装自定义组件之tabal列表编辑单元格组件实例代码
2017/09/07 Javascript
Vue项目添加动态浏览器头部title的方法
2018/07/11 Javascript
vue 使用class创建和清除水印的示例代码
2020/12/25 Vue.js
Python使用urllib模块的urlopen超时问题解决方法
2014/11/08 Python
python数据结构之图深度优先和广度优先实例详解
2015/07/08 Python
python实现给数组按片赋值的方法
2015/07/28 Python
java中的控制结构(if,循环)详解
2019/06/26 Python
使用Python实现 学生学籍管理系统
2019/11/26 Python
python实现梯度下降和逻辑回归
2020/03/24 Python
举例详解HTML5中使用JSON格式提交表单
2015/06/16 HTML / CSS
Gucci法国官方网站:意大利奢侈品牌
2018/07/25 全球购物
Kathmandu美国网站:新西兰户外运动品牌
2019/03/23 全球购物
机关保密承诺书
2014/06/03 职场文书
出纳岗位职责
2015/01/31 职场文书
自我推荐信格式模板
2015/03/24 职场文书
MySQL Shell import_table数据导入的实现
2021/08/07 MySQL
Go语言并发编程 sync.Once
2021/10/16 Golang