phpcakephpcakephp-3.0

CakePHP 3 - implementedEvents() - does not fire implemented event


Trying to start off with CakePHP's EventListener. I have set an event up, but it is not firing. I can't figure out why? This is the code I have so far...

public function view($slug = null) {
    $profile = $this->Profiles->find()->where(['slug' => $slug])->first();

    $this->set('profile', $profile);
    $this->set('_serialize', ['profile']);
}
// I have confirmed this works.. but it is not calling the updateCountEvent method
public function implementedEvents(){
    $_events = parent::implementedEvents();

    $events['Controller.afterView'] = 'updateCountEvent';

    return array_merge($_events, $events);
}

/**
 * Triggered when a profile is viewed...
 */
public function updateCountEvent(){
    Log::write('error', "Update count events"); // I dont get this line in the log. Not sure why this does not fire...
}

Solution

  • I revisited this question and was able to come up with a solution that works for me. Thanks Jose Lorenzo for the 'heads up'. This is my solution:

    use Cake\Event\Event;

    public function view($slug = null) {
        $profile = $this->Profiles->find()->where(['slug' => $slug])->first();
    
        $this->profileId = $profile->id;
    
        $event = new Event('Controller.Profiles.afterView', $this);
        $this->eventManager()->dispatch($event);
    
        $this->set('title', $profile->name);
        $this->set('profile', $profile);
        $this->set('_serialize', ['profile']);
    }
    
    public function implementedEvents(){
        $_events = parent::implementedEvents();
        $events['Controller.Profiles.afterView'] = 'updateCountEvent';
        return array_merge($_events, $events);
    }
    
    public function updateCountEvent(){
        $profile = $this->Profiles->get($this->profileId);  
        $profile->set('views_count', $profile->views_count + 1);
        $this->Profiles->save($profile);
    }
    

    I see the power of Events especially if I get to send out emails, update more tables and perhaps run a cron..., however instead of writing these 2 lines of code and create 2 more methods for this specific case, I could have made this simple call within the view action as such

    $profile->set('views_count', $profile->views_count + 1);
    $this->Profiles->save($profile);
    

    The question would be.... Should I have opted for this simpler process, or stick with the events route?