2017-10-05 3 views
4

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:

Laravel Horizon list

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; 
    } 
} 
+1

Afficher le code d'un fichier de notification. – Vikash

+0

Ajout du code de la classe de notification 'NewLikeOnPost'. –

+0

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

Répondre

0

Vérifiez votre .env pour être sûr que u vraiment utiliser REDIS

BROADCAST_DRIVER=redis 
CACHE_DRIVER=redis 
SESSION_DRIVER=redis 
SESSION_LIFETIME=120 
QUEUE_DRIVER=redis 

cache alors clair (php artisan cache:clear , php artisan view:clear), que devrait effacer le problème