引言
Yaf,全称 Yet Another Framework,是鸟哥开发的一个轻量级高性能的PHP开发框架,以PHP扩展的方式实现。由于其性能优异使用简单,目前国内很多大小公司都有使用。不过凡事都是两面的,正是由于其轻便小巧,因此并没有像其他PHP框架那么功能强大,为了开发方便,许多功能需要自己实现或者集成第三方的实现,比如ORM、模板引擎等。
如果说PHP是世界上最好的语言,那么Laravel就是最好的PHP框架了。Laravel是一套简洁、优雅的PHP Web开发框架,被称作为 WEB艺术家创造的PHP框架。框架基于Composer作为依赖管理和自动加载,非常方便的方便开发者使用各种优秀的轮子。Laravel本身就是由很多Composer组件组成的,有兴趣的可以研究一下。不过它的大多数组件都不能脱离Laravel集成到其他框架中使用,幸运的是,他强大的ORM组件Eloquent却可以很方便的集成到其他环境中。
Eloquent ORM是一套高级的PHP ActiveRecord实现,它能方便的将“约束(constraints)”应用到关系的双方,这样你就具有了对数据的完全控制,而且享受到ActiveRecord的所有便利。Eloquent原生支持Fluent中查询构造器的所有方法。具体的可以参看Laravel的相关文档了解。
由于我司主要的框架是Yaf,因此我曾试图把Eloquent和Yaf整合到一起,经过简单尝试成功了,而且两者很好的结合到一起了,接下来我带大家来一步步把Eloquent集成到Yaf中吧。
安装
在这里我们首先要在本地安装完成composer环境,关于composer的安装请自行根据官方文档(中文)完成传送门,在这里就不赘述了。完成composer安装后,在你创建的Yaf项目的根目录下执行composer require illuminate/database,就会自动创建一个composer.json文件,其中内容如下:
{
"require": {
"illuminate/database": "^5.4"
}
}
可能这时候一些童鞋的命令会卡死、或者提示请求失败之类的,不要紧张,这是伟大的GFW在保护你,这时候你可以通过一些手段让你的机器能够跨过墙,或者使用国内的composer仓库。使用国内的仓库只需要在composer.json加上仓库信息即可:
{
"require": {
"illuminate/database": "^5.4"
},
"repositories": {
"packagist": {
"type": "composer",
"url": "https://packagist.phpcomposer.com"
}
}
}
接下来完成安装。这时候在项目的根目录下回出现vendor目录,这就是composer管理的组件目录。
集成composer依赖包
用composer安装完成illuminate/database后,我们需要让框架能够自动加载它所管理的包,这时我们只需要在入口文件index.php里面加上下面的代码:
require APPLICATION_PATH . '/vendor/autoload.php';
现在在项目代码里就可以使用Eloquent里面的类了。
集成Eloquent
在Bootstrap.php中添加_initDatabase,我们让框架启动的时候初始化并启动Eloquent。
addConnection($this->config->database->toArray());
$capsule->setAsGlobal();
$capsule->bootEloquent();
}
}
现在就可以在models里面写model类,注意model类得继承Illuminate\Database\Eloquent\Model类。一般来说,Eloquent默认的表名是与类名一致的小写的复数。但是由于yaf的model类的类名都是以Model结尾的,很明显不是太合适,因此在model类里面需要加上$table属性,来指定对应的表。比如一个user表对应的Model类:
到现在为止,已经可以根据Eloquent的文档进行开发了。比如我想添加一个user,可以像下面这样写:
public function save()
{
$user = new UserModel;
$user->username = 'test';
$user->password = '123';
$user->name = 'Test';
$user->save();
}
也许这时候你会遇到这样的warning:/application/library/Doctrine/DBAL/Driver/PDOConnection.php: No such file or directory。这是由于在创建PDO连接的时候会判断是否有DBAL的PDO连接类,这里你可以选择不显示,或者也可以安装一下dbal的包。
Eloquent事件处理
Eloquent默认主键规则为自增,如果我想自定义主键生成规则,那么怎样才能更优雅的使用自己定义的id自动生成规则呢?
关于自定义id自动生成规则,如果不使用自增,一般能想到的就是在插入的时候直接设置主键的值。这样子的话多了很多重复代码,而且不优雅,与Laravel的主旨不符。Laravel另一个强大的组件就是其事件处理组件,此时我们可以借助事件组件来优雅的完成这件事。Eloquent在model的增删改查等节点,会触发相关事件,这时候我们只需要将相关业务代码放到事件监听中。
首先,得让Eloquent支持event,这时我们就需要引入一个新的包:illuminate/events,执行composer require illuminate/events安装
{
"require": {
"illuminate/database": "^5.4",
"doctrine/dbal": "^2.6",
"illuminate/events": "^5.4"
},
"repositories": {
"packagist": {
"type": "composer",
"url": "https://packagist.phpcomposer.com"
}
}
}
接下来需要在初始化Eloquent的时候添加事件分派
addConnection($this->config->database->toArray());
$capsule->setEventDispatcher(new Dispatcher($capsule->getContainer()));
$capsule->setAsGlobal();
$capsule->bootEloquent();
}
}
现在事件组件就会生效,接下来只需要在model类里重写boot方法,添加事件监听:
protected static function boot()
{
parent::boot();
static::creating(function ($model) {
$idWork = IdWork::getInstance();
$pk = $model->getKeyName();
$model->$pk = $idWork->nextId();
});
}
这里我的IdWork类,是Twitter的Snowflake算法的PHP实现
现在,当我们创建的时候就会触发这个事件,闭包的那个参数,便是当前的model类的对象。关于为什么要使用creating事件,因为当创建模型时,依次执行saving
、creating
、created
和saved
,而在更新模型时依次执行saving
、updating
、updated
和saved,生成id主要是在新建的时候才需要,所以,在creating事件里面写这个即可。所以大家可以根据实际需要编写事件相关的方法,完成各种需求,比如说数据缓存之类的。
Eloquent的非常强大,具体使用大家可以参看官方文档。