Nick
Nick

Reputation: 2980

Listen to eloquent model event in an observer

I can't find the syntax to listen to eloquent events in my event handler.

I subscribed my observer like so

Event::subscribe('Animekyun\Handlers\Events\EloquentEventHandler');

This observer is self-handling and is implemented like so:

namespace Animekyun\Handlers\Events;

use Illuminate\Events\Dispatcher;

class EloquentEventHandler
{

    public function onEpisodeSave($event) {
        dd('test');
    }

    public function subscribe(Dispatcher $events)
    {
        $events->listen('eloquent.saved: episode', 'Animekyun\Handlers\Events\EloquentEventHandler@onEpisodeSave');
    }

}

I don't know how to listen to any eloquent event in this form. I'm sure there is a way to listen to an event without doing things like:

User::creating(function($user)
{
    if ( ! $user->isValid()) return false;
});

EDIT: the user model

<?php

use Laracasts\Presenter\PresentableTrait;
use Conner\Likeable\LikeableTrait;

class Episode extends \Eloquent
{
    use PresentableTrait;
    use LikeableTrait;

    public static $rules = [
        'show_id'        => 'required',
        'episode_number' => 'required',
    ];

    // Add your validation rules here
    protected $presenter = 'Animekyun\Presenters\EpisodePresenter';

    // Don't forget to fill this array
    protected $fillable = ['title', 'body', 'links', 'show_id', 'episode_number', 'format_id', 'created_by', 'updated_by', 'screenshots'];

    public function scopeSearch($query, $search)
    {
        return $search;
    }

    public function user()
    {
        return $this->belongsTo('User', 'created_by');
    }

    public function show()
    {
        return $this->belongsTo('Show');
    }

    public function format()
    {
        return $this->belongsTo('Format');
    }

    public function rating()
    {
        return $this->morphMany('Rating', 'rateable');
    }

    public function getLinksAttribute()
    {
        return (array) json_decode($this->attributes['links'], true);
    }

    public function setLinksAttribute($value)
    {
        $this->attributes['links'] = json_encode($value);
    }
}

any ideas?

Upvotes: 4

Views: 1043

Answers (1)

Fad
Fad

Reputation: 9858

You're listening to the wrong event. Because string comparison is case sensitive, you should be listening to the eloquent.saved: Episode event. Note the capital E on Episode. The class name isn't converted to lowercase as the event is fired.

Additionally, while this doesn't apply to your particular case, it should be noted that if the class is defined under a namespace, like App for example, you need to include that namespace as well (i.e. App\Episode).

Upvotes: 1

Related Questions