I am trying to get into using Notifications in my Laravel 5.3 app. My first is to try and send a Welcome notification immediately after a new registration. After reading the docs and following the "What's new in Laravel 5.3" tutorial, I am getting a "Call to undefined method Illuminate\Notifications\Notification::send()" error after the record is saved.
The info below is the latest thing I have tried, but everything I try is failing. When I put the notification below the create method, I get a save, but no notification is sent. I put it in front just to see what would happen, hence the error.
Here is the Welcome:
<?php namespace App\Notifications; use Illuminate\Bus\Queueable; use Illuminate\Notifications\Notification; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Notifications\Messages\MailMessage; use App\User; class WelcomeToDStrokeTennis extends Notification { use Queueable; protected $user; /** * Create a new notification instance. * * @return void */ public function __construct(User $user) { } /** * Get the notification's delivery channels. * * @param mixed $notifiable * @return array */ public function via($notifiable) { return ['mail']; } /** * Get the mail representation of the notification. * * @param mixed $notifiable * @return \Illuminate\Notifications\Messages\MailMessage */ public function toMail($notifiable) { return (new MailMessage) ->line('MyApp Welcomes You.') ->action('Login To MyApp', 'http://dstroketennis.com') ->line('Thank you for trusting MyApp!'); } /** * Get the array representation of the notification. * * @param mixed $notifiable * @return array */ public function toArray($notifiable) { return [ // ]; } } The RegisterController:
<?php namespace App\Http\Controllers\Auth; use App\User; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Validator; use Illuminate\Foundation\Auth\RegistersUsers; use Illuminate\Notifications\Notification; use App\Notifications\WelcomeToMyApp; class RegisterController extends Controller { use RegistersUsers; protected $redirectTo = '/home'; public function __construct() { $this->middleware('guest'); } protected function validator(array $data) { return Validator::make($data, [ 'familyname' => 'required|max:255|unique:users', 'email' => 'required|email|max:255|unique:users', 'phone' => 'required|unique:users', 'password' => 'required|min:6|confirmed', ]); } protected function create(array $data) { Notification::send($data, new WelcomeToDStrokeTennis($data)); return User::create([ 'familyname' => $data['familyname'], 'email' => $data['email'], 'phone' => $data['phone'], 'password' => bcrypt($data['password']), ]); } } UPDATE: It seems that I am not getting the User instance required. I assume it is because of the type array. I have tried to collect the new user data into the $user variable, but it now throws the error: 'Call to member function 'notify()' on array. So I guess I am still not getting the right type.
protected function create(array $data) { $user = collect(User::create([ 'familyname' => $data['familyname'], 'email' => $data['email'], 'phone' => $data['phone'], 'password' => bcrypt($data['password']), ]))->all(); $user->notify(new WelcomeToMyApp($user)); return $user; } UPDATE: I am still trying to find an instance of User. My latest attempt:
protected function create(array $data) { User::create([ 'familyname' => $data['familyname'], 'email' => $data['email'], 'phone' => $data['phone'], 'password' => bcrypt($data['password']), ]); $user = User::orderBy('created_at', 'desc')->first(); $user->notify(new WelcomeToMyApp($user)); return $user; } I get the error: Undefined property: App\Notifications\WelcomeToMyApp::$id.
UPDATE... HAPPY HOLIDAYS!
I am showing the following data when I do a dd($users). I added the $data argument to the notification. I get the error:
FatalThrowableError in RegisterController.php line 66: Type error: Argument 2 passed to App\Http\Controllers\Auth\RegisterController::create() must be an instance of App\User, none given, called in /home/ubuntu/workspace/vendor/laravel/framework/src/Illuminate/Foundation/Auth/RegistersUsers.php on line 33
protected function create(array $data, User $user) { User::create([ 'familyname' => $data['familyname'], 'email' => $data['email'], 'phone' => $data['phone'], 'password' => bcrypt($data['password']), ]); $user = User::orderBy('created_at', 'desc')->first(); //dd($user); $user->notify(new WelcomeToMyApp($data)); return $user; } class WelcomeToDStrokeTennis extends Notification { use Queueable;
protected $user; protected $data; /** * Create a new notification instance. * * @return void */ public function __construct(array $data, User $user) { $this->data = $data; $this->user = $user; } /** * Get the notification's delivery channels. * * @param mixed $notifiable * @return array */ public function via($notifiable) { return ['mail']; } /** * Get the mail representation of the notification. * * @param mixed $notifiable * @return \Illuminate\Notifications\Messages\MailMessage */ public function toMail($notifiable) { return (new MailMessage) ->subject('MyApp Welcomes You.') ->greeting('You are now a registered user.') ->line('If you have not done so, please login and enter your player profile information') ->action('Login To D`Stroke Tennis', 'http://dstroketennis.com') ->line('Please call, text, or email if you have any problems or questions.'); } /** * Get the array representation of the notification. * * @param mixed $notifiable * @return array */ public function toArray($notifiable) { return [ // ]; } }
SOLUTION:
protected function create(array $data) { $user = User::create([ 'familyname' => $data['familyname'], 'email' => $data['email'], 'phone' => $data['phone'], 'password' => bcrypt($data['password']), ]); $user->notify(new WelcomeToMyApp($user)); return $user; } The parameters had to be removed from the notification class as well, but this is the code that works for this purpose.
