2017-01-27 10 views
2

Ich versuche, meine E-Mail-Aktion senden mit Laravel database Warteschlange jedoch diesen Prozess weiterhin in meinem Browser statt hinter zu arbeiten.Laravel 5.3 Queue Job funktioniert nicht

das ist mein Controller

protected function importUserExcel(UploadedFile $file, Request $request){ 

    $user_role = Role::where('name','=','user')->first(); 


    \Excel::load($file, function($reader) use ($user_role) { 
     $excel = $reader->select()->get(); 
     foreach($excel[0] as $line){ 
      $user = User::firstOrnew([ 
       'email' => $line['email']]); 
      $user->email = $line['email']; 
      $user->name = $line['name']; 
      $user->password= bcrypt(srand(15)); 

      $user->town = $line['town']; 
      $user->dealer_code = $line['dealer_code']; 
      $user->type = $line['type']; 
      // $user->save(); 
      $user->sendUserEmail(); 
      //$user->attachRole($user_role); 


     } 
    }); 
} 

diese Funktion mein Modell ist

public function sendUserEmail() 
{ 
    $delay = Carbon::now()->addMinutes(15); 
    \Log::info("Request Begins"); 
    $user = new SendEmails($this); 
    $user->delay($delay); 
    dispatch($user); 
    \Log::info("Request Ends"); 
} 

und das ist mein Job

Klasse Sendemails implementiert ShouldQueue { Verwendung InteractsWithQueue, Queueable, SerializesModels;

/** 
* Create a new job instance. 
* 
* @return void 
*/ 
public function __construct(User $user) 
{ 
    $this->handle($user); 

} 

/** 
* Execute the job. 
* 
* @return void 
*/ 
public function handle(User $user) 
{ 
    $broker = $user->broker; 
    $brokerInstance = \Password::broker($broker); 
    view()->share('locale', app()->getLocale()); 
    $response = $brokerInstance->sendResetLink([ 'email' => $user->email ], function (Message $message) { 
     $message->subject(trans('emails.welcome_subject')); 
    }); 
} 

}

jedoch Ergebnis scheint kommen schließlich nicht oder irgendetwas Warteschlangen zu verzögern. In der Zwischenzeit verarbeitet mein Browser auch, anstatt den Prozess hinter sich zu lassen.

enter image description here

+0

Konnten Sie Ihre Steuerfunktion voll posten? –

+0

ypdated @ VũTuấnAnh –

+0

Ihr Code scheint in Ordnung außer Ihrem Protokoll. Versuchen Sie, Ihr Protokoll in die 'SendEmails'-Klasse zu verschieben. Wenn Sie Logger in Ihr Modell drücken, können Sie die Verzögerungszeit nicht sehen. By the way, in Ihrem Controller-Funktionen sollte View zurückgeben, um die Antwort an den Browser zu senden –

Antwort

1

Ihre Aufgabe Konstruktor sollte nicht Aufruf der Griff() -Methode; Es sollte nur Eigenschaften festlegen, die für die Handle-Methode benötigt werden. Es liegt an Ihrem Warteschlangen-Worker, die Handle-Methode aufzurufen.

Ihr Aufruf von app() -> getLocale() ist möglicherweise falsch, wenn Sie das Gebietsschema pro Anfrage festlegen; Ein Job wird von einem anderen Prozess und ohne Middlewares oder einer zugehörigen http-Anfrage ausgeführt.

class SendEmails implements ShouldQueue { use InteractsWithQueue, Queueable, SerializesModels; 
    protected $user; 

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

    public function handle() { 
     $user = $this->user; 
     $broker = $user->broker; 
     $brokerInstance = \Password::broker($broker); 

     view()->share('locale', app()->getLocale()); 
     $response = $brokerInstance->sendResetLink([ 'email' => $user->email ], function (Message $message) { 
      $message->subject(trans('emails.welcome_subject')); 
     }); 
    } 
} 
Verwandte Themen