Model observer methods checks if any changes occur around model such as
- created() after record getting creeated
- creating() before record getting created
- updated() after record getting updated
- updating() before record getting updated
- retrieved() after record is retrieved
- saving() before creating/updating a record
- saved() after creating/updating a record
- deleting() before deleting a record
- deleted() after deleting a record
- restoring()
- restored()
In this post, we will be giving example of retrieved() method of model observer. Suppose, if we have a relation like this Post hasMany History and we need to save referecnes of post_id when post is viewed we can create Model observer like below in three steps.
Step 01: Creating PostObserver with php artisan command
php artisan make:observer PostObserver --model=Post
Step 02: Adding following snippet inside App\Observers\PostObserver.php
namespace App\Observers; use App\Models\Post; use App\Models\History; class PostObserver { public function retrieved(Post $post) { preg_match('/([a-z]*)@/i', request()->route()->getActionName(), $controller); // getting current requested controller name preg_match('/@([a-z]*)/i', request()->route()->getActionName(), $action); // getting current requested action name if( ( $controller[1] == 'PostController' && $action[1] == 'show') ) { // History saving repeatedly for a post
$history = new History(); $history->post_id = $post->id; $history->save();
// or History saving only once for a post
History::firstOrCreate(['post_id'=> $post->id]); } } }
In above snippet, we are saving a reference of post_id in history table when post is viewed by user in the browser in that particular post page.
One thing to note above, a particular controller and action checks are provided not to save History record everytime when post record is retrieved. History saving will be only implemented when user browses to show() method of PostController.
Step 03: Registering PostObserver.php inside boot() method in App/Providers/AppServiceProvider.php
// at the top use App\Observers\PostObserver;
use App\Models\Post; public function boot() { Post::observe(PostObserver::class); }