简体   繁体   中英

Laravel 5.3 Notification Send Error

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

dd($ user)

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.

Notification facade usage require first argument as collection of notifiable user instead of giving request data you should pass users collection change below

    $user = User::create([
        'familyname' => $data['familyname'],
        'email' => $data['email'],
        'phone' => $data['phone'],
        'password' => bcrypt($data['password']),
    ]);

   $user->notify(new WelcomeToDStrokeTennis($data));
    return $user;

This might be because Notification is a facade. Try using

use Notification;

Instead of,

use Illuminate\Notifications\Notification;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM