Команда Artisan уведомляет всех пользователей, дает BadMethodCallException

Как я могу создать команду ремесленника, чтобы отправить уведомление базы данных всем пользователям в системе, содержащее информацию о том, как долго они были в системе?

Моя команда SendEmails выглядит следующим образом:

    <?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use App\User;
use Illuminate\Support\Facades\Mail;
use App\Mail\UserEmails;
use Illuminate\Support\Facades\Notification;

class SendEmails extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'send:emails';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Send Email to allusers';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $users = User::all();
        foreach($users as $user){
            $created_at = $user->created_at;
            Notification::send($user, new SendEmailsNotification($created_at));
        }
    }
}

Затем я создал таблицу уведомлений, перенес и код ниже:

<?php

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;

class SendEmailsNotification extends Notification
{
    use Queueable;

    public $created_at;

    public function __construct($created_at)
    {
        $this->created_at = $created_at;
    }

    public function via($notifiable)
    {
        return ['database'];
    }

    public function toMail($notifiable)
    {
        return (new MailMessage)
                    ->line('The introduction to the notification.')
                    ->action('Notification Action', url('/'))
                    ->line('Thank you for using our application!');
    }

    public function toArray($notifiable)
    {
        return [
        ];
    }
}

User.php:

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
//use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    //use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password', 'address', 'image'
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        //'email_verified_at' => 'datetime',
        'address' => 'array'
    ];

    protected $uploads = '/images/';

    public function getImageAttribute($image){
        return $this->uploads . $image;
    }

    public function contacts(){
        return $this->hasMany('App\Contact');
    }
}

Когда я запускаю команду artisan "php artisan send:emails", я вижу следующую ошибку в консоли:

BadMethodCallException: вызов неопределенного метода App\User::routeNotificationFor()

Как я могу отправить уведомление всем пользователям?

2 ответа

Решение

Вам просто нужно раскомментировать // use Notifiable линия.

Notifiable черта включает в себя две другие черты, одна из которых является RoutesNotifications черта характера.

RoutesNotifications черта это то, что вам нужно, чтобы иметь возможность отправлять уведомления на User,


Кроме того, вы должны быть в состоянии упростить ваш код в вашем SendEmails команда быть:

Notification::send(User::all(), new SendEmailsNotification()); 

И вместо того, чтобы явно передать created_at вы можете просто получить к нему доступ из $notifiable в вашей SendEmailsNotification (как в этом случае $notifiable будет User модель в любом случае) например

public function toArray($notifiable)
{
    return [
        'data' => 'Account Created' . $notifiable->created_at->diffForHumans()
    ];
}

}

Прежде всего, вам нужно раскомментировать use Notifiable; как предложено в другом ответе. В настоящее время Notification::send() используется для отправки уведомления нескольким пользователям и ожидает, что первый аргумент будет набором уведомлений (т. е. пользователями), а не объектом. Чтобы отправлять уведомления индивидуально в цикле, вы должны сделать что-то вроде этого:

foreach($users as $user) {
    $created_at = $user->created_at;
    $user->notify(new SendEmailsNotification($created_at));
}

Но поскольку уведомление уже доступно в вашем уведомлении, лучшее решение будет выглядеть так:

Ваш класс уведомлений:

use Queueable;

public $created_at;

public function __construct()
{

}

public function via($notifiable)
{
    return ['database'];
}

public function toMail($notifiable)
{
    $created_at = $notifiable->created_at;
    return (new MailMessage)
                ->line('The introduction to the notification.')
                ->action('Notification Action', url('/'))
                ->line('Thank you for using our application!');
}

public function toArray($notifiable)
{
    $created_at = $notifiable->created_at;
    return [
    ];
}

И в вашей команде Ремесленника:

$users = User::all();
Notification::send($users, new SendEmailsNotification());

Надеюсь, это поможет.

Другие вопросы по тегам