0

クラスは初めてで、phpmailer クラスを使用する静的な電子メール クラスを作成しようとしています。

私がやりたいことは、次のようなものです...

Email::send('from', 'to', 'subject', 'html message'); // works

しかし、添付ファイルを追加したい場合...

Email::send('from', 'to', 'subject', 'html message')->attach('file/blah.txt');

これにより致命的なエラーがスローされます:Call to undefined method PHPMailer::attach()理由は理解できますが、可能であれば、Email クラスに上記のコードを実行させる方法がわかりません。

以下は私が実験したものです。

class Email {

    static $attach;

    public static function send($from, $to, $subject, $message)
    {
        $email = new PHPmailer();

        try {

            $email->AddAddress($to);
            $email->SetFrom($from);
            $email->Subject = $subject;
            $email->MsgHTML($message);

            if (self::$attach) $email->AddAttachment(self::$attach);        

            $email->Send();
        }
        catch (phpmailerException $e)
        {
            return $e->errorMessage();
        }
        catch (Exception $e)
        {
            return $e->getMessage();
        }

        return $email;
    }

    public static function attach($attachment)
    {
        self::$attach = $_SERVER['DOCUMENT_ROOT'].$attachment;
    }
}
4

2 に答える 2

2

APIは意味がありません。インスタンスを使用する必要があるチェーンを使用して実行しようとしていることを実行するには、静的を使用して、必要なものに近いインターフェイスを作成することもできます。

class Email {

    protected $attchements = array();
    protected $mailer;

    public function __construct($from, $to, $subject, $message) {
          $this->mailer = new PHPMailer();

          $this->mailer->AddAddress($to);
          $this->mailer->SetFrom($from);
          $this->mailer->Subject = $subject;
          $this->mailer->MsgHTML($message);

    }

    public static function create($from, $to, $subject, $message) {
        $instance = new Self($from, $to, $subject, $message);
        return $instance;

    }

    public static function createAndSend($from, $to, $subject, $message) {
         $instance = new Self($from, $to, $subject, $message);
         return $instance->send();
    }

    public function send()
    {
       if(!empty($this->attachments)) {
           foreach($this->attachments as $attachment) {
               $this->mailer->AddAttachment($attachment);
           }
       }

       return $this->mailer->send();        
    }

    public function attach($attachment)
    {
        $this->attachments[] = $_SERVER['DOCUMENT_ROOT'].$attachment;
        return $this;
    }
}

したがって、これを使用すると、使用法は次のようになります。

//simple
Email::createAndSend($to, $from, $subject, $message);

// with attachment
Email::create($to, $from, $subject, $message)
   ->attach('fileone.txt')
   ->attach('filetwo.txt')
   ->send();

また、私は私の例からあなたの例外処理を取り除いたことにも注意する必要があります...あなたはそれを統合する必要があります...私はそれを短くて甘いものにするためだけにそれをしました:-)

于 2012-10-18T22:13:38.553 に答える
0

Fluent命令は、オブジェクト(静的クラスとは異なります)で正常に機能します。

あなたの場合、単に命令を逆にします:

Email::attach('file/blah.txt');
Email::send('from', 'to', 'subject', 'html message');

ただし、実際のオブジェクトの方がうまくいく場合があります。

于 2012-10-18T22:11:48.793 に答える