2
votes

I am working on my API today, and I am having alot of problems getting my model events to work, I have 2 events currently, a created event and updating event, the logic is as follows,

    class Project extends Eloquent {

    protected $fillable = [
        'name',
        'description',
        'total_cost',
        'start_date',
        'finish_date',
        'sales_person',
        'project_manager',
        'client_id',
        'organisation_id',
        'user_id'
    ];

    use SoftDeletingTrait;

    protected $dates = ['deleted_at'];


    public static function boot()
    {
        parent::boot();

        static::created(function($project)
        {
            // Save the notifications for the user various users on the project

            // The projects organiastion owners need to be told that a project has been created.
            $notifyUsers = array();
            foreach($project->organisations->users as $person) {
                if($person->pivot->is_admin == "1" && $person->pivot->user_id != $project->user_id) {
                    $notifyUsers[]['id'] = $person->pivot->user_id;
                }
            }

            $notification = new Notification;
            //return $notification;
            //die(print_r($project));
            $notification->withBody($project->user->first_name . " " . $project->user->last_name . " created the project " . $project->name);
            $notification->withURI($project->slug);
            $notification->withIsNotification(1);
            $notification->regarding($project);
            $notification->withType('created');
            $notification->deliver($notifyUsers);


        });

        static::updated(function($project)
        {
            exit('!!!');
            foreach($project->organisations->users as $person) {
                if($person->pivot->is_admin == "1" && $person->pivot->user_id != $project->user_id) {
                    $notifyUsers[]['id'] = $person->pivot->user_id;
                }
            }

            return true;
        });
    }
}

The created method runs perfectly, but the updating method never seems to function, the exit never gets hit. I am updating my model via a PUT request, that hits this method in my controller,

public function edit($id)
{
    //if project have been seen 
    if( Input::get('viewed')){

        $project = Project::find($id);
        //update to show that user have viewd this project
        $project->projectview()->attach($id,array('user_id'=>ResourceServer::getOwnerId()));

        $project->load('projectview');

        return Response::json( $project, 200 );
    }


    $rules = array(
        // 'name' => 'required',
        'total_cost' => 'numeric',
    );  

    $validation = Validator::make(Input::all(), $rules);

    if($validation->fails()) {
        return Response::json( $validation->messages()->first(), 500);

    } else {

        $project = Project::find($id);

        $vars = array();

        foreach(Input::all() as $key => $value) {
            $vars[$key] = $value;
        }

        $projectToUpdate = $project->toArray();
        unset($projectToUpdate['created_at']);
        unset($projectToUpdate['updated_at']);



        if(Input::get('project_name') || Input::get('name') ){

            $project->name = Input::get('project_name')?Input::get('project_name'):Input::get('name');

            $project->uri_hash = Stringhelpers::_slugify( $project->name );// $this->_slugify($project->name);
        }


        $project->slug = $project->slug;
        // $project->slug = Stringhelpers::_uriHash( time().$project->name );
        $project->description = Input::get('description') ? Input::get('description'):$project->description;

        $project->total_cost = Input::get('total_cost') ? Input::get('total_cost') : $project->total_cost;

        $project->start_date = Input::get('start_date') ? Input::get('start_date') : $project->start_date;
        $project->finish_date = Input::get('finish_date') ? Input::get('finish_date'): $project->finish_date ;
        //if start date is passed finish date 
        $start_date_moment  = new \Moment\Moment($project->start_date);

        $finish_date_moment  = new \Moment\Moment($project->finish_date);

        if($start_date_moment->isAfter($finish_date_moment)){

            $project->start_date  = $start_date_moment->cloning()->startOf('week')->format('Y-m-d H:i:s');

            $project->finish_date  = $start_date_moment->cloning()->endOf('week')->format('Y-m-d H:i:s');
        }

        $project->status = Input::get('status') ?  Input::get('status')  : $project->status;
        // $project->user_id = ResourceServer::getOwnerId();

        $project->invoiced_at = Input::get('invoiced_at') ?Input::get('invoiced_at'):null;
        $project->archived_at = Input::get('archived_at') ? Input::get('archived_at') : "0000-00-00 00:00:00";
        $project->is_internal = Input::get('is_internal') ?Input::get('is_internal'):0;

        //return Input::get('name');

        $locked_by = "";

        if(Input::get('locked_by') == "0") {
            $locked_by = NULL;
        }
        if(is_null($locked_by)) {
            $project->locked_by = $locked_by;
        } elseif(Input::get('locked_by') != '0') {
            $project->locked_by = Input::get('locked_by');
        } else {
            $project->locked_by = $project->locked_by;
        }

        if(Input::get('owner') != 'user') {
            $project->organisation_id = Input::get('organisation_id') ?  Input::get('organisation_id') : $project->organisation_id;
            $project->owner_id = Input::get('organisation_id') ?  Input::get('organisation_id'): $project->owner_id ;
            $project->client_id = Input::get('client_id') ? Input::get('client_id') : $project->client_id;

        } else {
            // $project->user_id = Input::get('user_id') ?  Input::get('user_id') : $project->user_id ;
            $project->owner_id = Input::get('owner_id') ? Input::get('owner_id') : $project->owner_id  ;
            $project->organisation_id = Input::get('organisation_id') ? Input::get('organisation_id') : $project->organisation_id;
            $project->client_id = Input::get('client_id') ? Input::get('client_id') : $project->client_id;
        }

        if(is_array(Input::get('sales_person'))) {
            $project->sales_person = Input::get('sales_person.id') ?  Input::get('sales_person.id') : $project->sales_person ;
        } else {
            $project->sales_person = Input::get('sales_person') ?  Input::get('sales_person')  : $project->sales_person ;
        }

        $project->client_id = Input::get('client_id') ?  Input::get('client_id') : $project->client_id;

        $client_user_detail  = DB::table('users')
            ->leftjoin('client_user','users.id','=','client_user.user_id')
            ->where('client_user.client_id', '=', Input::get('client_id'))
            ->orWhere('users.id', '=', $project->owner_id)
            ->get();

        if($project->organisation_id == ''){

            $client_user_detail  = DB::table('users')
                ->select('users.id','users.email','users.first_name','users.last_name','users.display_name','users.initials','users.invite_code','projects.owner_id')
                ->leftjoin('projects','users.id','=','projects.owner_id')
                ->leftjoin('client_user','users.id','=','client_user.user_id')
                ->where('client_user.client_id', '=', Input::get('client_id'))
                ->orWhere('users.id', '=', $project->owner_id)
                ->distinct()
                ->get();

        }else{

            $client_user_detail  = DB::table('users')
                ->leftjoin('client_user','users.id','=','client_user.user_id','users.invite_code')
                ->leftjoin('client_organisation','client_user.user_id','=','client_organisation.client_id')
                ->leftjoin('organisations','client_organisation.organisation_id','=','organisations.id')
                ->where('client_user.client_id', '=', Input::get('client_id'))
                ->get();

        }

        $collab_id = array();
        $team_id = array();
        $pm_id = array();

        //return Input::get('collaborators');

        if( is_array(Input::get('collaborators') ) ){
            //return Input::get('collaborators');
            $collabo =  Input::get('collaborators');

            if( empty($collabo) ){

                $project->collaborators()->detach();

            }else{

                foreach( $collabo as $collab) {
                    $collab_id[] = $collab['id'];
                }
            }

        }

        if(is_array(Input::get('project_manager')) ){

            $managers = Input::get('project_manager');

            if( empty($managers) ){

                $project->projectmanager()->detach();

            }else{

                foreach( $managers as $pm ) {
                    $pm_id[] = $pm['id'];
                }
            }

        }

        if($project->save() ) {


            if(isset($collab_id) && Input::get('collaborators')) {
                $project->collaborators()->sync($collab_id);
            }
            if(isset($pm_id) && Input::get('project_manager')) {
                $project->projectmanager()->sync($pm_id);
            }

            // $project->organisations()->sync(array($project->organisation_id));
            $project->load('clients');
            $project->load('projectmanager');
            $project->load('salesperson');
            $project->load('collaborators');
            $project->load('user');
            $project->load('projectview');


            $project->client_user  = $client_user_detail;

            //return json_encode(array("id" => Input::get('socketId')));

             Pusherer::trigger('project_'.$project->id, 'post:change', json_encode(Input::all()), Input::get('socketId'));

            return Response::json(array('text' => 'Successful!'), 200 );

        } else {

            return Response::json( array( 'error', 'Somthing has gone wrong!' ), 500);

        }
    }

The database does actually get updated, but the model event just doesn't happen, I don't know why that is?

2
The event is triggered for me. Are you sure save() happens and data is updated in the database? Are you getting the "Successufl!" response?jedrzej.kurylo
Yep I get a 200 response, and the database row is updated.Udders

2 Answers

0
votes

First of all: It seems ::updated is only triggered if the record is 'dirty' when saving while ::updating is triggered at every update attempt. Maybe this solves your problem. But besides this I wouldn't go this way. What I advise you to do is:

Add a Observer for your model:

namespace App\Observers;

class UserObserver
{
    /**
     * @param $model
     */
    public function creating($model)
    {
        event(new MyEvent($model));
    }

    /**
     * @param $model
     */
    public function updating($model)
    {
        event(new MyEvent($model));
    }
}

Providers\ObserverServiceProvider:

public function boot()
{
    \App\User::observe(new \App\Observers\UserObserver());
}

So you now have a neat observer listening to the creating and updating of your model. Next is adding the event to do the required stuff (notifying people or whatever you want to do).

See http://laravel.com/docs/5.0/events for the documentation of how to create event.

0
votes

It should be static::updating instead of static::updated