【问题标题】:Laravel Job not recognizing object propertyLaravel Job 无法识别对象属性
【发布时间】:2018-12-09 20:48:56
【问题描述】:

我正在向工作类传递一个请求,以发送电子邮件以获取联系表。问题是我无法直接访问该属性。

我将构造函数中的$request设置为$this->request = $request;

handle() 方法中,我这样做:

\Log::info('job-contact-request', ['request' => $this->request]);

日志吐出:

[2018-06-30 14:07:34] local.INFO: request {"request":"[object] (App\Events\ContactRequestValidated: {\"request\":{\"client_name\": \"Daniel\",\"client_email\":\"email@email.com\",\"client_phone\":\"1234567891\",\"client_text\":\"blargle carble darble zarble\"}, \"socket\":null})"}

这表明 client_email 已设置。但是当我尝试访问$this->request->client_email 时,我得到:

[2018-06-30 14:15:30] local.ERROR: 未定义属性:App\Events\ContactRequestValidated::$client_email {"exception":"[object] (ErrorException(code: 0): Undefined property : App\Events\ContactRequestValidated::$client_email at /var/www/site/laravel/app/Jobs/SendContactRequestEmail.php:36) [堆栈跟踪]

【问题讨论】:

  • 可以分享一下代码吗?
  • @Marcus 我在下面的回答中发现了这个问题。

标签: laravel jobs laravel-events laravel-jobs


【解决方案1】:

只是弄乱了 Laravel 事件/侦听器/工作,有几件事我必须纠正。跨多个类的日志真的让我失望。

在 Event 构造函数中,我必须在设置请求时使用all() 方法。

$this->request = $request->all() 按属性名称正确访问数据。

// Event Constructor
public function __construct( ContactRequest $request )
    {
        $this->request = $request->all();
        // \Log::info( 'Event-Constructor', [ 'contact_request' => $this->request ] );
    }

事件向侦听器传递一个事件对象,其中包含事件构造函数中设置的数据作为事件对象的属性。必须通过事件对象访问数据。

// Listener
public function handle( ContactRequestValidated $event )
    {
        // \Log::info( 'listener', [ 'contact-event' => $event->request ] );

        dispatch( new SendContactRequestEmail( $event->request ));
    }

下一部分我不太确定为什么会这样,但是在工作中,请求从一个对象变成了一个数组。

所以这是工作代码:

// Job Constructor
public function __construct( $request )
    {
        $this->request = $request; // Actually an array, not an object
    }

// Job handle
public function handle()
    {
        // \Log::info( 'job-contact-request', [ 'request' => $this->request ] );

        $email = new ConfirmContactRequest( $this->request );

        \Log::info( 'job-contact-request', [ 'email_html' => $email ] );

        // Note request has to be accessed by array notation rather than arrow method
        Mail::to( $this->request['client_email'] )->send( $email );
    }

【讨论】:

  • 这是一个注册的监听器吗?您的句柄方法接收事件作为其第一个参数。我可能错了,但我认为没有理由使用构造函数。遵循我提到的似乎是“Laravel 方式”
猜你喜欢
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
  • 2022-09-28
  • 2018-03-11
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 2012-08-11
相关资源
最近更新 更多