The tap() helper allows you to perform operations on an object and return the object itself:
Without tap()
$user = User::create($request->validated());
$user->assignRole('member');
$user->sendWelcomeEmail();
return $user;
With tap()
return tap(User::create($request->validated()), function ($user) {
$user->assignRole('member');
$user->sendWelcomeEmail();
});
Even Shorter with Arrow Functions
return tap(User::create($request->validated()))
->assignRole('member')
->sendWelcomeEmail();
This is especially useful when you want to update and return a model in one line:
return tap($user)->update(['last_login' => now()]);