2017-09-16 21 views
10

mam następujący błąd:laravel Powiadomienia Event Listener Undefined Property

Undefined property: Illuminate\Notifications\Events\NotificationSent::$user in /var/www/app/app/Listeners/NoticationListener.php:31

Błąd występuje tutaj:

<?php 

namespace App\Listeners; 

use Illuminate\Notifications\Events\NotificationSent; 
use Illuminate\Queue\InteractsWithQueue; 
use Illuminate\Contracts\Queue\ShouldQueue; 

class NoticationListener implements ShouldQueue 
{ 
    /** 
    * Create the event listener. 
    * 
    * @return void 
    */ 
    public function __construct() 
    { 
     // 
    } 

    /** 
    * Handle the event. 
    * 
    * @param NotificationSent $event 
    * @return void 
    */ 
    public function handle(NotificationSent $event) 
    { 
     $notification = $event->notifiable; 
     $addressee = $notification; //error here 
     $address = $notification; 
     $type = "Notification"; 
     dispatch(new SendEmail($type,$addressee,$address)); 
    } 
} 

ja tego nie rozumiem niezdefiniowanej właściwości, szczególnie na tej linii. Jak mogę stąd odebrać dd()? Próbowałem zalogować $event, ale nie mogłem go zarejestrować, tylko dostałem ten błąd.

Moje powiadomienia działają bardzo dobrze w aplikacji, chcę tylko e-mail, aby im towarzyszyć, dlatego mam tego zdarzenia-słuchacza/pracy.

Dziękuję.

EDIT

repozytorium kodu, który jest dysponowanie zgłoszenie jest poniżej:

public function notify($asset) 
{ 
    $users = User::where("id","!=",Auth::user()->id)->get(); 
    Notification::send($users, new NewAsset($asset)); 
} 

To rozszerzenie klasy Notification jest poniżej:

class NewAsset extends Notification 
{ 
    use Queueable; 

    /** 
    * Create a new notification instance. 
    * 
    * @return void 
    */ 
    protected $asset; 

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

    /** 
    * 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 toArray($notifiable) 
    { 
     return [ 
      'asset_id' => $this->asset->id 
     ]; 
    } 
} 

Edytowanie 2

Jeśli ktoś mógłby doradzić, jak wykonać kontrolę błędów w tym momencie, może to być przydatne w przyszłości. Ponieważ kod jest asynchroniczny na serwerze, nie zwraca danych do klienta, a kiedy próbuję go pobrać do Log, wydaje się, że nie robi tego, zanim zostanie przechwycony przez błąd.

Jak mogę przeprowadzić debugowanie w tym scenariuszu?

Przyjrzałem się architekturze source code i nie mam pojęcia, skąd pochodzi właściwość $ user. Zakładam, że ma to związek z $event->notifiable związanym z modelem User, ale jeśli jest on uruchamiany poprawnie dla wszystkich użytkowników, których dotyczy problem, z aplikacji, dlaczego jego własność miałaby być w tym kontekście wartością undefined?

Proszę o pomoc, dziękuję.

+0

Czy możesz pokazać nam swoje wydarzenie NotificationSent? –

+1

@EduardoPacios to kod framework - patrz tutaj (https://github.com/laravel/framework/blob/bd352a0d2ca93775fce8ef02365b03fc4fb8cbb0/src/Illuminate/Notifications/Events/NotificationSent.php) –

+0

uruchamiam również klasę powiadomień i pracę, jeśli nie korzystasz z funkcji podlegającej notyfikacji przy wyjątku throw użytkownika: BadMethodCallException: wywołanie niezdefiniowanej metody Illuminate \ Database \ Query \ Builder :: routeNotificationFor(), ale Twój błąd jest Must cudowny, ustaw kolejkę na synchronizację i przetestuj wartość $ event – honarkhah

Odpowiedz

2

To dziwny problem. Jak się sam znalazłeś, Laravel nie ustawił na tym obiekcie właściwości $user, więc trzeba w to zaangażować coś innego.Oto moje rozumienie procesu:

  1. Notification::send() -> enqueue NewAsset powiadomienie dla każdego użytkownika
  2. rozkolejkowania wewnętrzny praca dla NewAsset powiadomienia -> wysyłanie powiadomień
  3. Ogień NotificationSent Event -> enqueue NotificationListener obsługi

Błąd pojawia się tutaj:

  1. rozkolejkowania wewnętrzny praca dla NotificationListener obsługi -> zdarzenia uchwyt
  2. praca Wysłanie do SendEmail [Kolejkuj jeśli ShouldQueue]
  3. [rozkolejkowania praca dla SendEmail jeśli ShouldQueue] -> Wyślij e-maila z powiadomieniem

Jak widać, jest wiele serializacji i deserializacji, które występują podczas zapisywania i piszowania zadań dla powiadomienia. Wygląda na to, że framework próbuje ustawić właściwość $user podczas deserializacji zdarzenia NotificationSent z kolejki, ale trudno powiedzieć z tego pytania bez pełnego śledzenia stosu i nie jestem pewien, co dodaje $user do zserializowanych danych bez większa widoczność kodu.

Oto kilka sugestii debugowania spróbować:

Set QUEUE_DRIVER do sync:

Zapobiega to układ zdarzeń w ramach regulacyjnych z szeregowania danych zdarzeń. Jeśli e-mail z powiadomieniem wysyła bezbłędnie, to wiemy, że niestandardowy kod gdzieś dodaje właściwość $user do zdarzenia.

Sprawdź dane kolejka odcinkach:

To nie wynika z kwestii, która kolejka sterownik aplikacja używa. Jeśli jesteś nie przy użyciu sync, możemy spojrzeć na oczekujące prace w kolejce, aby spróbować znaleźć rozbieżności (w bazie danych, redis, itp.).

  1. Zatrzymaj wszystkich pracowników kolejki.
  2. Wywołać powiadomienie za pośrednictwem aplikacji.
  3. Wykonaj php artisan queue:work --once, aby ręcznie przetworzyć jedno zadanie, dopóki zadanie oczekujące w kolejce nie zostanie uruchomione i nie zostanie uruchomione zdarzenie NotificationSent.
  4. Sprawdzić pracę utworzony w kolejce, aby obsłużyć zdarzenia NotificationSent

Możemy również użyć tego podejścia do zrzutu danych przy użyciu dd() podczas pracy kolejki ponieważ artisan queue:work --once wyciągów w planie.

Nie enqueue procedurę obsługi zdarzeńNotificationSent:

Ponieważ powiadomienie jest już skonfigurowany do przetwarzania w kolejce zadanie w tle, nie koniecznie enqueue obsługi zdarzeń powiadomienia, jak również. Spróbuj usunąć interfejs ShouldQueue, aby sprawdzić, czy to rozwiąże problem.

Jak wspomnieli inni komentatorzy, ten problem może być lepiej rozwiązany przy użyciu Laravel Mail Notifications, które całkowicie eliminują potrzebę osobnego programu obsługi zdarzeń NotificationSent.