2016-03-26 13 views
5

Korzystanie z Laravel 5, potrzebuję 2 różnych widoków na e-mail służący do resetowania hasła. Domyślną ścieżką do widoku wiadomości e-mail jest email.password. Ale pod pewnymi warunkami chcę wysłać emaile.password_alternative.Zmiana ścieżki widoku wiadomości e-mail w celu zresetowania hasła w Laravel

Jak mogę to zrobić? (Z PasswordBroker od laravel)

To jest mój bieżący kod:

public function __construct(Guard $auth, PasswordBroker $passwords) 
{ 
    $this->auth = $auth; 
    $this->passwords = $passwords; 
} 

public function sendReset(PasswordResetRequest $request) 
{ 
    //HERE : If something, use another email view instead of the default one from the config file 
    $response = $this->passwords->sendResetLink($request->only('email'), function($m) 
    { 
     $m->subject($this->getEmailSubject()); 
    }); 
} 

Odpowiedz

4

Korzystanie PasswordBroker i oparte na klasie Illuminate/Auth/Passwords/PasswordBroker.php The $emailView jest zmienną chronione, więc nie można zmienić wartości raz w klasie jest tworzone.

jednak masz kilka rozwiązań:

  1. Można tworzyć własne klasy, która rozciąga PasswordBroker i używać.

    class MyPasswordBroker extends PasswordBroker { 
        public function setEmailView($view) { 
         $this->emailView = $view; 
        } 
    } 
    
    // (...) 
    
    public function __construct(Guard $auth, MyPasswordBroker $passwords) 
    { 
        $this->auth = $auth; 
        $this->passwords = $passwords; 
    } 
    
    public function sendReset(PasswordResetRequest $request) 
    { 
        if ($someConditionHere) { 
         $this->passwords->setEmailView('emails.password_alternative'); 
        } 
        $response = $this->passwords->sendResetLink($request->only('email'), function($m) 
        { 
         $m->subject($this->getEmailSubject()); 
        }); 
    } 
    
  2. Można by stworzyć PasswordBroker w swojej metodzie, bez użycia Dependency Injection.

    public function sendReset(PasswordResetRequest $request) 
    { 
        $emailView = 'emails.password'; 
    
        if ($someConditionHere) { 
         $emailView = 'emails.password_alternative'; 
        } 
    
        $passwords = new PasswordBroker(
         App::make('TokenRepositoryInterface'), 
         App::make('UserProvider'), 
         App::make('MailerContract'), 
         $emailView 
        ); 
    
        $response = $passwords->sendResetLink($request->only('email'), function($m) 
        { 
         $m->subject($this->getEmailSubject()); 
        }); 
    } 
    

    To jest brzydsze rozwiązanie, a jeśli masz zautomatyzowane testy to będzie ból pracować.

Zastrzeżone: Nie Przetestowałem któregokolwiek z tym kodem.

+0

Aha, zapomniałem wspomnieć używam laravel PasswordBroker – Kalzem

+0

Czy istnieje powód dlaczego zmienna jest chroniony bez setter? A może Laravel zabezpieczył go, ponieważ nie wymyślił przypadku, w którym ludzie chcieliby go zmienić? – Kalzem

+0

Zgaduję, że o tym nie pomyśleli. Najlepszym sposobem, aby się tego dowiedzieć, jest stworzenie problemu GitHub i omówienie tego z głównymi programistami Laravel. –

7

Dla wszystkich zainteresowanych laravel 5.2 można ustawić niestandardowy HTML i tekst e-mail widok dla resetowania hasła dodając

config(['auth.passwords.users.email' => ['auth.emails.password.html', 'auth.emails.password.text']]); 

do PasswordController.php w konstruktorze przed wywołaniem middleware.

To zastępuje konfigurację app/config/auth.php dla PasswordBroker.

Blade Szablon do wiadomości e-mail resetowania hasła leży wówczas:

yourprojectname/Resources/views/auth/maile/hasło/html.blade.php yourprojectname/Resources/views/auth/maili/hasło/text.blade.php

Zajęło mi wystarczająco długo.

Kredyty: http://ericlbarnes.com/2015/10/14/how-to-send-both-html-and-plain-text-password-reset-emails-in-laravel-5-1/ http://academe.co.uk/2014/01/laravel-multipart-registration-and-reminder-emails/