Je construis une API avec Laravel et je veux envoyer une notification push en utilisant le système Laravel Notifications. J'ai un modèle pour les correspondances (qui est essentiellement un post), un autre utilisateur peut aimer ce match. Lorsque le match est aimé, le créateur de la publication recevra une notification push. C'est juste comme Instagram, Facebook, etc.Aucun résultat de recherche pour le modèle [App Models Match]
Souvent, la notification push n'a pas été envoyée à l'utilisateur. J'ai installé Laravel Horizon pour voir s'il y avait des erreurs. Parfois, la notification était envoyée et parfois non. Avec exactement les mêmes données:
La notification échoue parfois avec les mêmes données (même utilisateur, même match).
L'erreur est comme suit:
Illuminate \ Database \ Eloquent \ ModelNotFoundException: Pas de résultats de requête pour le modèle [App \ Modèles \ match] 118 dans /home/forge/owowgolf.com/vendor /laravel/framework/src/Illuminate/Database/Eloquent/Builder.php:312
Je suis sûr que le match et l'utilisateur existe dans la base de données, j'ai vérifié que avant d'envoyer la notification. Est-ce que quelqu'un sait ce qui ne va pas? Tout ce que j'ai pu trouver en ligne, c'est que les gens n'ont pas sauvegardé leur modèle avant d'envoyer la notification dans la file d'attente. Mais la ligne où le code envoie la notification dans la file d'attente ne serait même pas atteinte si le modèle n'existait pas. En raison de la liaison implicite dans la route/le contrôleur.
méthode Contrôleur:
/**
* Like a match.
*
* @param \App\Models\Match $match
* @return \Illuminate\Http\JsonResponse
*/
public function show(Match $match)
{
$match->like();
$players = $match->players()->where('user_id', '!=', currentUser()->id)->get();
foreach ($players as $user) {
$user->notify(new NewLikeOnPost($match, currentUser()));
}
return ok();
}
Notification:
<?php
namespace App\Notifications;
use App\Models\Match;
use App\Models\User;
use Illuminate\Bus\Queueable;
use NotificationChannels\Apn\ApnChannel;
use NotificationChannels\Apn\ApnMessage;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
class NewLikeOnPost extends Notification implements ShouldQueue
{
use Queueable;
/**
* The match instance.
*
* @var \App\Models\Match
*/
private $match;
/**
* The user instance.
*
* @var \App\Models\User
*/
private $user;
/**
* Create a new notification instance.
*
* @param \App\Models\Match $match
* @param \App\Models\User $user
*/
public function __construct(Match $match, User $user)
{
$this->user = $user;
$this->match = $match;
$this->onQueue('high');
}
/**
* Get the notification's delivery channels.
*
* @param \App\Models\User $notifiable
* @return array
*/
public function via($notifiable)
{
if ($notifiable->wantsPushNotification($this)) {
return ['database', ApnChannel::class];
}
return ['database'];
}
/**
* Get the mail representation of the notification.
*
* @param \App\Models\User $notifiable
* @return \NotificationChannels\Apn\ApnMessage
*/
public function toApn($notifiable)
{
return ApnMessage::create()
->badge($notifiable->unreadNotifications()->count())
->sound('success')
->body($this->user->username . ' flagged your match.');
}
/**
* Get the array representation of the notification.
*
* @param mixed $notifiable
* @return array
*/
public function toArray($notifiable)
{
return [
'user_id' => $this->user->id,
'body' => "<flag>Flagged</flag> your match.",
'link' => route('matches.show', $this->match),
'match_id' => $this->match->id,
];
}
/**
* Get the match attribute.
*
* @return \App\Models\Match
*/
public function getMatch()
{
return $this->match;
}
}
Afficher le code d'un fichier de notification. – Vikash
Ajout du code de la classe de notification 'NewLikeOnPost'. –
Je ne suis pas sûr, mais n'importe où vous essayez d'accéder aux données de session dans vos travaux ou toute fonction ou objet que vous traitez dans la file d'attente utilise la session? – Vikash