2016-08-22 2 views
2

기존 API가 Laravel로 작성되었으며 RabbitMQ 대기열에서 데이터를 게시하려고합니다. 제 3 자 라이브러리를 사용하여 RabbitMQ를 기본 Laravel Queue 아키텍처에 통합했습니다. 리스너 콘솔 명령이 실행 중일 때 제대로 작동하며 메시지를 올바르게 처리하고 있습니다. 내가 큐 핸들러에 필요한 작업 및 데이터 키를 포함하는 다음 이벤트, ... 외부 서비스의 Laravel 대기열 수신기

{"job":"SixtyFiveContrib\\Jobs\\[email protected]","data":{"title":"","story":"Testing 123","author":"Ewan Valentine","email":"","address":"","dob":"","phone":"","site":"The Lad Bible","legal":"The LAD bible - Facebook","agreed":false,"signature":"","files":[{"filename":"test.png","filesize":0,"filetype":""}],"agreement":{"id":"","facebook_id":""},"attempts":1036}} 

내가 대기 이벤트를 처리하는 클래스를 통지를 통과 할 때

그러나, 클래스 경로를 분할 및 메서드 이름 (SixtyFiveContrib \ Jobs \ CreateSubmissionMetaDataJob 및 핸들)을 가져 와서 컨테이너에서 해당 클래스를 호출하려고합니다.

그러나 작업은 자동으로 컨테이너의 일부가 아닙니다. 나는 용기에 자신을 일을 추가하려고하면 내가 생략하면, 나는

$this->app->bind(\SixtyFiveContrib\Jobs\CreateSubmissionMetaDataJob::class, function() { 
    return \SixtyFiveContrib\Jobs\CreateSubmissionMetaDataJob(????); 
}); 

... 내가 동적으로 예를 들어, 작업에 큐에서 '데이터'를 통과 할 수없는 상황으로 실행 컨테이너에서이 항목은, 큐 핸들러가 더 이상 작업을 해결할 수없는, 나는 다음과 같은 오류가 ...


확인할 수없는 의존성 해결 [매개 변수 # 0 [\ 계약 \ 컨테이너 \ BindingResolutionException를 조명] 수 [$ data]] SixtyFiveContrib \ Jobs \ CreateSubmissionMeta 클래스의 데이터 012

여기 내 직업 클래스 (민감한 비즈니스 로직 생략)입니다.

<?php 

namespace SixtyFiveContrib\Jobs; 

use App; 

use Illuminate\Queue\SerializesModels; 
use Illuminate\Queue\InteractsWithQueue; 
use Illuminate\Contracts\Bus\SelfHandling; 
use Illuminate\Contracts\Queue\ShouldQueue; 

use SixtyFiveContrib\Jobs\Job; 

/** 
* CreateSubmissionsMetaDataJob 
* 
* @author Ewan Valentine <[email protected]> 
* @copyright The LAD bible Group - 2016 
*/ 
class CreateSubmissionMetaDataJob extends Job implements SelfHandling 
{ 
    use InteractsWithQueue, SerializesModels; 

    /** 
    * @var array $data 
    */ 
    public $data; 

    /** 
    * __construct 
    * 
    * @param array $this->data 
    */ 
    public function __construct($data) 
    { 
     $this->data = $data; 
    } 

    public function handle() 
    { 
     try { 

      // Omitted 
     } catch (\Exception $e) { 
      \Log::error($e->getMessage() . " " . $e->getLine()); 
      return $e->getMessage(); 
     } 
    } 
} 

답변

1

그래, 알아 냈어! 데이터를 두 번째 매개 변수로 handle 또는 fire 메서드에 전달해야합니다. 첫 번째 인수는 응용 프로그램 인스턴스입니다.

<?php 

namespace SixtyFiveContrib\Jobs; 

use App; 

use Illuminate\Queue\SerializesModels; 
use Illuminate\Queue\InteractsWithQueue; 
use Illuminate\Contracts\Bus\SelfHandling; 
use Illuminate\Contracts\Queue\ShouldQueue; 

use SixtyFiveContrib\Jobs\Job; 

/** 
* CreateSubmissionsMetaDataJob 
* 
* @author Ewan Valentine <[email protected]> 
* @copyright The LAD bible Group - 2016 
*/ 
class CreateSubmissionMetaDataJob extends Job implements SelfHandling 
{ 
    use InteractsWithQueue, SerializesModels; 

    /** 
    * @var array $data 
    */ 
    public $data; 

    /** 
    * __construct 
    */ 
    public function __construct() 
    { 
    } 

    public function handle($app, array $data) 
    { 
     try { 

      // Omitted 
     } catch (\Exception $e) { 
      \Log::error($e->getMessage() . " " . $e->getLine()); 
      return $e->getMessage(); 
     } 
    } 
} 
+1

나는 비슷한 비슷한 것을 시도하고 있기 때문에 매우 관심이 많습니다. 당신은 이것을 기꺼이 공유 할 의향이 있습니까? – caro

관련 문제