【发布时间】:2015-03-12 11:39:00
【问题描述】:
为了我的项目目的,我在 CakePHP v3.0.0-RC2 上测试了事件系统。我首先要为长文道歉。
基本上,我创建了一个包含字段 id、name 和 surname 的 users 表。然后,我创建了另一个名为 user_statistics 的表,用于统计每月用户创建的数量。下面是保存用户、为 UserStatistics 表对象创建事件并最终调度事件的函数。
use Cake\Event\Event;
class UsersTable extends Table
{
//Other code
public function createUser($user)
{
if( $this->save( $user )){
$event = new Event('Model.User.afterPlace', $this, array(
'user' => $user
));
$this->eventManager()->dispatch( $event );
return true;
}
return false;
}
}
这个函数完成了它的预期 - 部分如此 - 因为它似乎没有调度事件,而只是保存用户数据。也许问题在于 UserStatistics 表对象。下面是我如何实现处理用户计数的函数的代码 sn-p。
use Cake\Event\EventListenerInterface;
class UserStatistics extends Table implements EventListenerInterface
{
//Code ommitted for in account of relevence
public function tallyUsers( $event )
{
$data = array();
if(!empty($event->subject()->user)){
$date = date('Y-m-d');
// Check existing record of today
$record = $this->find()->where(array('date' => $date));
if(empty($record)){
//Insert new record if none exist for the current date
$data = array(
'date' => $date,
'count' => 1
);
}else{
//Update record if date exist by incerementi count field by one
$count = (int) $record->count + 1;
$data = array(
'id' => $record->id,
'date' => $date,
'count' => $count
);
}
if($this->save($data))
return true;
else
return false;
}
}
}
在此之后,我对我应该在哪里注册 UserStatistics 以便它能够观察 User 对象有一点误解。当然,我已经在我的 UserStatistics 表对象上实现了 implementedEvents() 方法(见下文):
public function implementedEvents()
{
return array(
'Model.User.afterPlace' => 'tallyUsers'
);
}
我发现我应该在 UsersController 中注册我的观察者(UserStatistics)。以下是我的做法:
...
publiv function add()
{
if($this->request->is('post')){
$this->loadModel('UserStatistics');
$this->Users->eventManager()->on( $this->UserStatistics );
if($this->Users->createUser( $user )){
....
}
}
}
问题:
- 如何访问传递给用户表对象的数组用户,即数组('user' => $user)?
- 返回 true 或 false 假设在 Users 表对象的 createUser 方法中做什么?
- 我是否在控制器内部的主体模型上传递了观察者对象?
- 我的 UserStatistics tallUsers() 方法是否应该返回任何内容?
请帮助我理解,因为我无法从文档本身或任何其他地方找到关于这个主题的明确阅读材料。
【问题讨论】:
标签: php cakephp observer-pattern cakephp-3.0