Yaf集成Eloquent

引言

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事件,因为当创建模型时,依次执行savingcreatingcreatedsaved,而在更新模型时依次执行savingupdatingupdated和saved,生成id主要是在新建的时候才需要,所以,在creating事件里面写这个即可。所以大家可以根据实际需要编写事件相关的方法,完成各种需求,比如说数据缓存之类的。

Eloquent的非常强大,具体使用大家可以参看官方文档。

你可能感兴趣的:(Yaf集成Eloquent)