0

Swiftmailer のドキュメントには、Decorator プラグインを使用して置換を処理する独自のクラスを作成できると書かれています。

class DbReplacements implements Swift_Plugins_Decorator_Replacements {
  public function getReplacementsFor($address) {
    $sql = sprintf(
      "SELECT * FROM user WHERE email = '%s'",
      mysql_real_escape_string($address)
    );

    $result = mysql_query($sql);

    if ($row = mysql_fetch_assoc($result)) {
      return array(
        '{username}'=>$row['username'],
        '{password}'=>$row['password']
      );
    }
  }
}

しかし、私の場合、私のデータベースには重複した電子メール アドレスが含まれています。つまり、同じアドレスが 3 ~ 4 個のアカウントに表示される可能性があるため、代わりにユーザー ID に基づいて代わりのアドレスを取得する必要があります。

基準に一致するように上記のクラスを変更するにはどうすればよいですか?

4

2 に答える 2

1

swiftmailerid について何も知らないので、自分でメールを id に変換する必要があります。たとえばDbReplacements、連想配列を保持するための新しいプロパティを追加し'email' => 'id'(もちろん、最初は既知の ID に制限されますSELECT email, id FROM user WHERE id IN(1,3,6,77)) getReplacementsFor、この配列のインデックスとして email を使用して、ユーザー ID を取得します。

より明確にするためのコードサンプル:

class DbReplacements implements Swift_Plugins_Decorator_Replacements {
  public $email2id = array();
  public function getReplacementsFor($address) {
    $sql = sprintf(
      "SELECT * FROM user WHERE id = %d", $this->email2id[$address]
    );

    $result = mysql_query($sql);

    if ($row = mysql_fetch_assoc($result)) {
      return array(
        '{username}'=>$row['username'],
        '{password}'=>$row['password']
      );
    }
  }
}

$dbReplacer = new DbReplacements();
$decorator = new Swift_Plugins_DecoratorPlugin($dbReplacer); 
$mailer->registerPlugin($decorator);

$users = array(
    array('email'=>'john.doe@example.com', 'id' => 16),
    array('email'=>'john.doe2@example.com', 'id' => 13),
);

foreach ($users as $user) {
  $message->addTo($user['email']);
  $dbReplacer->email2id[$user['email']] = $user['id'];
}
于 2012-11-04T09:33:10.313 に答える
1

基準に一致するように上記のクラスを変更するにはどうすればよいですか?

できません。IDがありません。少なくとも問題のメッセージ (つまり、舞台裏で発生しているイベントのメッセージ) に関連付けられた ID がない場合を除き、Class Swift_Plugins_DecoratorPlugin独自の_Replacementsインターフェイスを提供する具体的なサブタイプを作成することはできません。交換依頼時のメッセージ。

置き換え用のデコレータ プラグインである独自のプラグインを作成しましょう。

<?php

interface My_Swift_Plugins_Decorator_Replacements extends Swift_Plugins_Decorator_Replacements
{
    public function setMessage(Swift_Mime_Message $message);
}

class My_Swift_Plugins_DecoratorPlugin extends Swift_Plugins_DecoratorPlugin implements My_Swift_Plugins_Decorator_Replacements
{

    private $_replacements;

    public function __construct(My_Swift_Plugins_Decorator_Replacements $replacements) {
        $this->_replacements = $replacements;
    }

    /**
     * Invoked immediately before the Message is sent.
     *
     * @param Swift_Events_SendEvent $evt
     */
    public function beforeSendPerformed(Swift_Events_SendEvent $evt) {
        $this->setMessage($evt->getMessage());
        parent::beforeSendPerformed($evt);
    }

    public function setMessage(Swift_Mime_Message $message) {
        $this->_replacements->setMessage($message);
    }
}

プラグインでメッセージに ID を割り当てると、が呼び出されるにメッセージ セットが取得されます。getReplacementsFor次に、それをプロパティに割り当てて、その関数で読み取ることができます。

class DbReplacements implements My_Swift_Plugins_Decorator_Replacements {
  private $message;
  public function setMessage(Swift_Mime_Message $message) {
      $this->message = $message;
  }

  public function getReplacementsFor($address) {
    $sql = sprintf(
      "SELECT * FROM user WHERE email = '%s' and id = '%d'",
      mysql_real_escape_string($address),
      $this->message->emailID;
    );

    $result = mysql_query($sql);

    if ($row = mysql_fetch_assoc($result)) {
      return array(
        '{username}'=>$row['username'],
        '{password}'=>$row['password']
      );
    }
  }
}
于 2012-11-04T10:22:09.810 に答える