2017-09-16 20 views
10

Tôi có lỗi sau:Laravel Notifications Event Listener Không xác định tài sản

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

Lỗi này xảy ra ở đây:

<?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)); 
    } 
} 

Tôi không hiểu tài sản không xác định này, đặc biệt là trên dòng này. Làm thế nào tôi có thể dd() từ đây? Tôi đã cố gắng để đăng nhập $event nhưng tôi không thể nhận được nó để đăng nhập, chỉ có lỗi này.

Thông báo của tôi hoạt động rất tốt trong ứng dụng, tôi chỉ muốn có email để đi cùng với họ, đó là lý do tại sao tôi có người nghe/sự kiện này.

Cảm ơn bạn.

EDIT

Mã kho được cử thông báo là dưới đây:

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

Đó mở rộng của lớp Notification là dưới đây:

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 
     ]; 
    } 
} 

EDIT 2

Nếu ai đó có thể tư vấn cách kiểm tra lỗi tại thời điểm này, điều đó có thể hữu ích trong tương lai. Bởi vì mã không đồng bộ trên máy chủ, nó không trả lại dữ liệu cho máy khách và khi tôi cố gắng chuyển nó thành Log, nó dường như không làm như vậy trước khi nó bị lỗi.

Tôi làm cách nào để gỡ lỗi trong trường hợp này?

Tôi đã xem xét khung của source code và không biết nơi tài sản người dùng $ đến từ đâu. Tôi giả sử nó phải làm với $event->notifiable được gắn với mô hình User, nhưng nếu nó bắn đúng cách cho tất cả người dùng bị ảnh hưởng từ bên trong ứng dụng, tại sao thuộc tính của nó là undefined trong ngữ cảnh này?

Vui lòng hỗ trợ, cảm ơn bạn.

+0

Bạn có thể cho chúng tôi biết sự kiện NotificationSent của bạn không? –

+1

@EduardoPacios là mã khung - xem tại đây (https://github.com/laravel/framework/blob/bd352a0d2ca93775fce8ef02365b03fc4fb8cbb0/src/Illuminate/Notifications/Events/NotificationSent.php) –

+0

tôi cũng chạy lớp thông báo này và làm việc, nếu bạn không sử dụng tính năng Notifiable trên người dùng ném ngoại lệ như thế này: BadMethodCallException: Gọi đến phương thức undefined Illuminate \ Database \ Query \ Builder :: routeNotificationFor(), nhưng lỗi của bạn là Phải tự hỏi, hãy đặt hàng đợi trên đồng bộ và giá trị thử nghiệm của $ event – honarkhah

Trả lời

2

Đây là vấn đề lạ. Khi bạn tìm thấy chính mình, Laravel không thiết lập thuộc tính $user trên chính đối tượng đó, vì vậy cái gì đó khác phải được tham gia.Dưới đây là sự hiểu biết của tôi về quá trình:

  1. Notification::send() -> enqueue NewAsset thông báo cho mỗi người dùng
  2. công việc nội bộ Dequeue cho NewAsset thông báo -> gửi thông báo
  3. cháy NotificationSent sự kiện -> enqueue NotificationListener handler

Lỗi dường như xảy ra ở đây:

  1. công việc nội bộ Dequeue cho NotificationListener handler -> xử lý sự kiện
  2. công việc văn cho SendEmail [enqueue nếu ShouldQueue]
  3. [Dequeue việc làm cho SendEmail nếu ShouldQueue] -> Gửi email thông báo

Như bạn có thể thấy, có rất nhiều serialization và deserialization xảy ra khi enqueueing và dequeueing công việc cho thông báo. Dường như khung làm việc cố gắng thiết lập thuộc tính $user khi deserializing sự kiện NotificationSent từ hàng đợi, nhưng thật khó để nói từ câu hỏi của bạn mà không có dấu vết ngăn xếp đầy đủ và tôi không chắc chắn điều gì sẽ thêm $user vào dữ liệu được tuần tự hóa khả năng hiển thị nhiều hơn vào mã.

Dưới đây là một số gợi ý gỡ lỗi để thử:

Set QUEUE_DRIVER-sync:

Điều này ngăn cản hệ thống sự kiện của khung từ serializing dữ liệu sự kiện. Nếu email thông báo gửi mà không có bất kỳ lỗi nào, thì chúng tôi biết rằng mã tùy chỉnh ở đâu đó đang thêm thuộc tính $user vào sự kiện.

Kiểm tra hàng đợi serialized dữ liệu:

Nó không rõ ràng từ các câu hỏi mà xếp hàng lái xe ứng dụng của bạn sử dụng. Nếu bạn là không phải sử dụng sync, chúng tôi có thể xem các công việc đang chờ xử lý trong hàng đợi để tìm sự khác biệt (trong cơ sở dữ liệu, redis, v.v ...).

  1. Dừng tất cả công nhân xếp hàng.
  2. Kích hoạt thông báo thông qua ứng dụng.
  3. Chạy php artisan queue:work --once để xử lý thủ công một công việc cho đến khi công việc xếp hàng chạy và kích hoạt sự kiện NotificationSent.
  4. Kiểm tra công việc được tạo ra trong hàng đợi để xử lý các sự kiện NotificationSent

Chúng tôi cũng có thể sử dụng phương pháp này để đổ dữ liệu sử dụng dd() trong công việc hàng đợi vì artisan queue:work --once chạy ở mặt trước.

Đừng enqueue handler NotificationSent kiện:

Bởi vì thông báo đã được cấu hình để xử lý trong một công việc nền xếp hàng đợi, chúng tôi không nhất thiết cần phải enqueue xử lý sự kiện thông báo là tốt. Thử xóa giao diện ShouldQueue để xem cách này có giải quyết được sự cố hay không.

Như những người bình luận khác đã đề cập, vấn đề này có thể được giải quyết tốt hơn bằng cách sử dụng bộ xử lý sự kiện Mail Notifications của Laravel, loại bỏ hoàn toàn nhu cầu xử lý sự kiện riêng biệt NotificationSent.

Các vấn đề liên quan