Команда 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());
Надеюсь, это поможет.