SwiftMailer Docs说您可以创建自己的课程以使用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进行替换。
如何修改上述类以匹配我的标准?
由于swiftmailer
对ID一无所知,因此您必须将电子邮件转换为ID。例如,将新属性添加到DbReplacements
持有关联数组'email' => 'id'
(当然首先限制为已知ID,即SELECT email, id FROM user WHERE id IN(1,3,6,77)
),在getReplacementsFor
中,只需在此数组中使用电子邮件作为索引即可获取用户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'];
}
如何修改上述课程以匹配我的标准?
你不能。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']
);
}
}
}