【问题标题】:CakePHP 3.0 Custom Event ImplementationCakePHP 3.0 自定义事件实现
【发布时间】: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 )){
        ....
      }
   }
}

问题:

  1. 如何访问传递给用户表对象的数组用户,即数组('user' => $user)?
  2. 返回 true 或 false 假设在 Users 表对象的 createUser 方法中做什么?
  3. 我是否在控制器内部的主体模型上传递了观察者对象?
  4. 我的 UserStatistics tallUsers() 方法是否应该返回任何内容?

请帮助我理解,因为我无法从文档本身或任何其他地方找到关于这个主题的明确阅读材料。

【问题讨论】:

    标签: php cakephp observer-pattern cakephp-3.0


    【解决方案1】:

    我已经设法让两个表对象相互交谈。每次用户对象创建新用户时,用户统计表都会更新一条记录,在我们的例子中是我们的主题。

    为了让它发挥作用,我经历了很多例外。基本上我必须强制执行主键,因为它无法创建没有 id 的新实体。我希望能够在该特定月份不存在记录时创建新记录,否则如果记录确实存在,则更新计数字段。所以问题出在下面的代码上:

    public function update( $event )
    {
      if(!empty( $event->data)){
    
        // find current month's record
         if( empty( $record )){
           //Create a new row
           $entity = new \App\Model\Entity\UserStatistic(['id' => 1, 'date' => $date, 'count' => 1]);
           $update = $this->save($entity);
         }else{
           $entity = new \App\Model\Entity\UserStatistic(['id' => $record->id + 1, 'count' => (int) $record->count + 1]);
    
           $updated = $this->save( $entity );
          }
       }
    }
    

    这段代码有问题,我无法确定,但最终我能够试验框架提供的事件系统,我现在想相信的问题与事件系统有关。任何有关上述解释的帮助将不胜感激。

    【讨论】:

    • 更新方法基本上是初始问题上的tallyUsers方法。我只想知道如何使用自定义数组中的数据而不是表单来保存数据。例如,统计数据不会来自表单,但现在是手动生成的,我该如何注入这个 gor 持久性?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多