2016-04-04 8 views
1

documentationによれば、implementEventsを私のメーラーに直接追加して、自分のコードからすべてのメールロジックを分離することができます。CakePHPのimplementEvents()はメールでは発生しません

しかし、私はドキュメントの正確な例に従ってください。実装されたイベント関数が動作しないのがわかります。 (電子メールを送信しない&は何もログに記録しません)

どこかで私のemailerクラスを実装する必要がありますか?もしそうなら、私はどのように私のemailerクラスを登録すべきですか?

これは私のメーラークラスです:

<?php 
namespace App\Mailer; 

use Cake\Mailer\Mailer; 
use Cake\Log\Log; 


/** 
* Purchase mailer. 
*/ 
class PurchaseMailer extends Mailer 
{ 

    /** 
    * Mailer's name. 
    * 
    * @var string 
    */ 
    static public $name = 'Purchase'; 



    public function implementedEvents() 
    { 
     return [ 
      'Model.afterSave' => 'onStatusChange' 
     ]; 
    } 

    public function onStatusChange(Event $event, EntityInterface $entity, ArrayObject $options) 
    { 
     Log::write(
      'info', 
      'd1' 
     ); 

     //if ($entity->isNew()) { 
      $this->send('sendStatusChangeMails', [$entity]); 
     //} 
    } 


    /** 
    * @param EntityInterface $entity 
    * @return [type] 
    */ 
    public function sendStatusChangeMails($entity) 
    { 
     Log::write(
      'info', 
      'd2' 
     ); 
     //if($entity->status_id == 1) { 
      //@todo email??? 
      $this 
        ->template('purchase') 
        ->layout('default') 
        ->emailFormat('html') 
        ->from(['[email protected]' => 'TEST']) 
        ->to('[email protected]') 
        ->subject('test') 
        ->set(['content' => 'this is a purhcase testing mail.']); 
     //} 
    } 


} 
+4

あなたはより多くのコンテキストを追加する必要があり、あなたのメーラーコードは、問題を再現するのに十分ではありません。メーラー/リスナーを登録するコードは特に重要です。 – ndm

+0

まあ、それは質問です。私はどうしたらいいですか?ドキュメントでは、メール論理を他のコードと区別するために、これと何もしないことが記載されています。私のメーラーをどのように登録すればよいですか? –

+0

その時点で、ドキュメントはすでにあなたが** [イベントシステムの仕組み]を読んでいると期待しているようです(http://book.cakephp.org/3.0/en/core-libraries/events.html#registering -listeners)**イベントセクションへのリンクが参考になるかもしれません.GitHub(https://github.com/cakephp/docs/issues)で**をお勧めしたいかもしれません。 – ndm

答えて

1

回答はメーラークラスとイベントのドキュメントです。

https://api.cakephp.org/3.2/class-Cake.Mailer.Mailer.html

https://book.cakephp.org/3.0/en/core-libraries/events.html#registering-listeners

我々メーラアプリケーションブートストラップにおける、または表クラスの初期化()フックに登録することができるいずれか。

だから、あなたはあなたのUsersTable初期にメールで購読できます。

public function initialize(array $config) 
{ 
    parent::initialize($config); 

    $mailer = new UserMailer(); //use App\Mailer\UserMailer; 
    $this->eventManager()->on($mailer); 

    //more code... 
} 
関連する問題