2017-08-17 7 views
0

Ich erstelle ein Laravel-Paket, das von der Verwendung von E-Mails profitieren würde. Wenn ein Benutzer mein Paket verwenden möchte, möchte er eine Datei per E-Mail versenden, die vom Paket erstellt wurde, aber auch einige benutzerdefinierte Header für die E-Mail festlegen.Set Mailable Header über ein Merkmal?

In einer idealen Lösung würde ich gerne eine Eigenschaft haben, dass der Entwickler einfach use auf ihre Mail-Klasse und es würde automatisch den Header für diese E-Mail ohne zusätzlichen Code gesetzt. Ist das etwas, das sogar über die Verwendung eines Merkmals möglich ist?

einige Lösungen hinzugefügt haben Header mailables vorgeschlagen durch diese in der build Methode setzen:

$this->withSwiftMessage(function ($message) { 
    $headers = $message->getHeaders(); 
    $headers->addTextHeader('mime', 'text/calendar'); 
}); 

Aber ist es eine Möglichkeit, meine eigene benutzerdefinierte Eigenschaft huckepack auf dem build Methode des verschickbare zu haben, das ist Verwenden Sie es, ohne es in der Mailable-Klasse selbst schreiben zu müssen?

Antwort

1

Lösung TRAITS

Der einzige Weg, dies zu tun, um der Lage sein, mit einem Merkmal der build Methode in Ihrer Eigenschaft definieren würde und machen Sie Ihren Benutzer statt build eine andere Funktion zu definieren, so dass Sie die direkte haben Manipulation der tatsächlich von Mailable Klasse verwendeten Funktion.

So würde Ihr Merkmal sein:

trait IsMailable { 


    public function build() 
    { 
      $this->withSwiftMessage(function ($message) { 
       $headers = $message->getHeaders(); 
       $headers->addTextHeader('mime', 'text/calendar'); 
      }); 

      if(!method_exists($this, 'buildMail')) throw \Exception('buildMail is not defined!'); 
      return $this->buildMail(); 
     } 



} 

So wird Ihre Benutzer die Methode buildMail statt build zu definieren.

OPTIMAL SOLUTION

Die optimale Lösung, IMHO würde, kann die Klasse erweitern Illuminate\Mail\Mailable Neudefinition der Methode send und macht den Endbenutzer statt Illuminate\Mail\Mailable dieses neu definierte Klasse implementieren.

So würde Ihre Klasse:

class Mailable extends \Illuminate\Mail\Mailable { 

    /** 
    * Send the message using the given mailer. 
    * 
    * @param \Illuminate\Contracts\Mail\Mailer $mailer 
    * @return void 
    */ 
    public function send(MailerContract $mailer) 
    { 
     $this->withSwiftMessage(function ($message) { 
      $headers = $message->getHeaders(); 
      $headers->addTextHeader('mime', 'text/calendar'); 
     }); 

     parent::send($mailer); 
    } 
} 

tun, dass Ihre Benutzer die build Methode verwenden können, wie es die Standard-Illuminate\Mail\Mailable-Klasse tun würde, aber das Endergebnis wäre, dass Ihre Klasse, um die zusätzliche Informationen Huckepack, dass Du brauchst es wirklich.