2015-12-22 19 views
9

Sto utilizzando il tratto ResetsPasswords di laravel per implementare la reimpostazione della password. Quello che mi piacerebbe ottenere è inviare l'e-mail usando la coda. Scavando attraverso il codice che ho trovato la linea di seguito nella funzione Postemail():Come inviare il link per reimpostare la password via e-mail utilizzando la coda in laravel 5

$response = Password::sendResetLink($request->only('email'), function (Message $message) { 
      $message->subject($this->getEmailSubject()); 
     }); 

Scavando ulteriormente noto che la funzione sendResetLink() è implementato in una classe PasswordBroker che a sua volta chiama la funzione emailResetLink(). Funzione emailResetLink restituisce il seguente:

return $this->mailer->send($view, compact('token', 'user'), function ($m) use ($user, $token, $callback) { 
      $m->to($user->getEmailForPasswordReset()); 

cui posso semplicemente cambiare mailer->send-mailer->queue. È un modo migliore di farlo senza modificare questo file non di progetto?

risposta

4

Qui è dove il container Laravel viene in soccorso. Se non ti piace la funzionalità di un componente principale, puoi procedere e ignorarlo in modo abbastanza semplice.

Per prima cosa è necessario creare il proprio PasswordBroker:

namespace App\Auth\Passwords; 

use Illuminate\Auth\Passwords\PasswordBroker as IlluminatePasswordBroker; 

class PasswordBroker extends IlluminatePasswordBroker 
{ 

    public function emailResetLink() 
    { 
     $view = $this->emailView; 

     return $this->mailer->queue($view, compact('token', 'user'), function ($m) use ($user, $token, $callback) { 
      $m->to($user->getEmailForPasswordReset()); 
      if (! is_null($callback)) { 
       call_user_func($callback, $m, $user, $token); 
      } 
     }); 
    } 

} 

Cambia lo spazio dei nomi per quello che vuoi, se si desidera posizionare altrove nella vostra app.

Poiché il fornitore di servizi che registra il servizio è un deferred service provider, sarà necessario creare il proprio provider per sostituirlo. Probabilmente il modo più semplice per farlo è estendere Illuminate\Auth\Passwords\PasswordResetServiceProvider con qualcosa come il seguente:

namespace App\Providers; 

use App\Auth\Passwords\PasswordBroker; 

class PasswordResetServiceProvider extends \Illuminate\Auth\Passwords\PasswordResetServiceProvider 
{ 

    protected function registerPasswordBroker() 
    { 
     $this->app->singleton('auth.password', function ($app) { 
      $tokens = $app['auth.password.tokens']; 

      $users = $app['auth']->driver()->getProvider(); 

      $view = $app['config']['auth.password.email']; 

      return new PasswordBroker(
       $tokens, $users, $app['mailer'], $view 
      ); 
     }); 
    } 

} 

Infine nel file config/app.php rimuovere Illuminate\Auth\Passwords\PasswordResetServiceProvider::class e aggiungere App\Providers\PasswordResetServiceProvider::class al vostro 'providers' array.

Laravel utilizzerà ora l'implementazione di PasswordBroker anziché di quella di serie e non dovrete preoccuparvi di modificare il codice del framework.

+0

Grazie @ marcus.ramsden per il tuo contributo. Ho seguito il tuo approccio ma non riesco a capire perché non funzioni. Non ho alcun errore. Sembra che stia ancora chiamando 'emailResetLink' della classe genitrice invece di quella sovrascritta. –

+0

Scusate il mio errore nell'esempio, nella parte di registrazione del vostro fornitore di servizi che dovrebbe essere '$ this-> app-> singleton' invece di' $ this-> app-> bind'.Anche il fornitore di servizi di base che registra le cose è un [fornitore differito] (http://laravel.com/docs/master/providers#deferred-providers). Otterrò le cose aggiornate tra un momento. –

+0

Grazie ancora per il tuo contributo. '$ this-> app-> singleton' non sta facendo il trucco neanche. Ancora chiamando il metodo genitore. –

5

So che è stata data una risposta ma ho trovato un altro modo per accodare la notifica di reimpostazione della password che ho trovato molto più semplice. L'ho provato su Laravel 5.3.

Per impostazione predefinita, la notifica di reimpostazione della password è implementata dalla classe Illuminate\Auth\Notifications\ResetPassword. Questa classe viene istanziata nel modello User nel metodo sendPasswordResetNotification e passata al metodo notify del tratto Illuminate\Notifications\Notifiable.

Quindi, fare la fila notifica di reimpostazione della password è sufficiente creare nuova classe ResetPassword notifica via artisan make:notification ResetPassword e sostituirlo è il codice con questo:

<?php 

namespace App\Notifications; 

use Illuminate\Bus\Queueable; 
use Illuminate\Contracts\Queue\ShouldQueue; 
use Illuminate\Auth\Notifications\ResetPassword as ResetPasswordNotification; 

class ResetPassword extends ResetPasswordNotification implements ShouldQueue 
{ 
    use Queueable; 
} 

E ora basta sovrascrivere sendPasswordResetNotification metodo nella App\User classe:

<?php 

... 
use App\Notifications\ResetPassword as ResetPasswordNotification; 
...  

/** 
* Send the password reset notification. 
* 
* @param string $token 
* @return void 
*/ 
public function sendPasswordResetNotification($token) 
{ 
    $this->notify(new ResetPasswordNotification($token)); 
} 
+0

Penso che questo sia il migliore e semplice, questo funziona come un fascino in L5.4 – Nisam

+0

Documentazione pertinente: https://laravel.com/docs/5.5/notifications#queueing-notifications – Lemmings19

+0

Per specificare la coda: '$ this- > notify ((new ResetPasswordNotification ($ token)) -> onQueue ('code-name')); ' – Lemmings19