2017-05-22 5 views
1

Ich benutze L5.3.Laravel Queueable Benachrichtigung nach dem Löschen Das Modell funktioniert nicht

Ich habe eine Menge Queueable Laravel Benachrichtigungen, sie arbeiten mit Redis in Ordnung. Außer Benachrichtigungen im Zusammenhang mit dem Löschen einiger Eloquent-Modelle.

Hier Mitteilung Quelle Beispiel ist:

<?php 

namespace App\Notifications\Games; 

use App\Helpers\NotificationHelper; 
use App\Game; 
use Illuminate\Bus\Queueable; 
use Illuminate\Notifications\Notification; 
use Illuminate\Contracts\Queue\ShouldQueue; 
use Illuminate\Notifications\Messages\MailMessage; 
use Illuminate\Support\Facades\Log; 

class Deleted extends Notification implements ShouldQueue 
{ 
    use Queueable; 

    public $game; 
    private $game_id; 

    public function __construct($game_id) 
    { 
    $this->game_id = $game_id; 
    $this->game = Game::withTrashed()->with('situation')->find($game_id); 
    // Log::info($this->game) here shows everything is ok 
    } 

    /** 
    * Get the notification's delivery channels. 
    * 
    * @param mixed $notifiable 
    * @return array 
    */ 
    public function via($notifiable) 
    { 
    return ['database']; 
    } 

    /** 
    * Get the array representation of the notification. 
    * 
    * @param mixed $notifiable 
    * @return array 
    */ 
    public function toDatabase($notifiable) 
    { 
    return [ 
     'game_id' => $this->game->id, 
     'html' => '' . view('notifications.games.deleted', ['id' => $this->id, 'game' => $this->game, 'notifiable' => $notifiable]) 
    ]; 
    } 
} 

Und es ist, wie ich es an: $user->notify(new Deleted($id));

Wenn ich implements ShouldQueue entfernen, Benachrichtigung funktioniert. Aber ich brauche Warteschlangen wegen der Verwendung mehrerer externer Dienste (wie Telegram, Facebook, Ein Signal usw.) und einige Benachrichtigungen könnten an viele Benutzer gesendet werden.

Es gibt auch keine Fehler in storage\logs\laravel.log und storage\logs\worker.log Dateien. Keine Artikel in failed_jobs Tabelle.

Und ja, ich soft deleting Modelle verwenden.

Antwort

0

Ok, schließlich fand ich 2 Lösungen, die Entsendung beide:

Es ist keine wirkliche Lösung, eher wie ein schmutziger Hack mir scheint, weil je nach Situation könnte es Ihnen viel mehr Code machen geschrieben.

// Change Eloquent to Array in constructor 
$this->game = Game::withTrashed()->with('situation')->find($game_id)->toArray(); 

// And then change all your toDatabase, toMail, toFacebook etc methods: use $game['name'] instead of $game->name etc. 

Das ist, was ich entschied:

// Remove $game from constructor... 
public function __construct($game_id) 
    { 
    $this->game_id = $game_id; 
    } 

// Then add it to your toDatabase, toMail, toFacebook etc methods: 
public function toDatabase($notifiable) 
    { 
    $game = Game::withTrashed()->with('situation')->find($this->game_id); 
    return [ 
     'game_id' => $this->game_id, 
     'html' => '' . view('notifications.games.deleted', ['id' => $this->id, 'game' => $game, 'notifiable' => $notifiable]) 
    ]; 
    } 

Mit zweiter Methode werden wir Spielmodell von DB 2 Mal abrufen, wenn wir 2 Benachrichtigungskanäle haben, 10-mal, wenn wir 10 Kanäle. Ja, das ist Overhead, aber wir können alle Eloquent-Collection-Helfer benutzen usw. Deshalb habe ich die zweite Methode anstelle von Arrays gewählt. Ich hoffe, das hilft jemandem irgendwann.

Und ich werde mich freuen, zu hören, warum wir nicht Eloquent Modell in Konstruktor bekommen können.

Verwandte Themen