From a4bba80244a50d9da8385f92e2e933420b173867 Mon Sep 17 00:00:00 2001 From: evpav Date: Tue, 11 Apr 2017 17:43:15 +0300 Subject: [PATCH] Added support for cloning `Message` --- CHANGELOG.md | 1 + Message.php | 14 +++++++++++++- tests/MessageTest.php | 19 +++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fa82226..eacfdaf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ Yii Framework 2 swiftmailer extension Change Log 2.0.7 under development ----------------------- +- Bug #46: Fixed `yii\swiftmailer\Message` does not clones `$swiftMessage` during its own cloning (evpav, klimov-paul) - Enh #37: `yii\swiftmailer\Logger` now chooses logging level depending on incoming entry format (klimov-paul) - Enh #40: Added `yii\swiftmailer\Message::setHeaders()` allowing to setup custom headers in batch (klimov-paul) diff --git a/Message.php b/Message.php index 4b8234e..5815b95 100644 --- a/Message.php +++ b/Message.php @@ -46,6 +46,18 @@ class Message extends BaseMessage /** + * This method is called after the object is created by cloning an existing one. + * It ensures [[swiftMessage]] is also cloned. + * @since 2.0.7 + */ + public function __clone() + { + if (is_object($this->_swiftMessage)) { + $this->_swiftMessage = clone $this->_swiftMessage; + } + } + + /** * @return \Swift_Message Swift message instance. */ public function getSwiftMessage() @@ -563,4 +575,4 @@ class Message extends BaseMessage { return $this->getSwiftMessage()->getReadReceiptTo(); } -} \ No newline at end of file +} diff --git a/tests/MessageTest.php b/tests/MessageTest.php index 43fe828..7b2c75d 100644 --- a/tests/MessageTest.php +++ b/tests/MessageTest.php @@ -174,6 +174,25 @@ class MessageTest extends TestCase } /** + * @depends testSetGet + */ + public function testClone() + { + $m1 = new Message(); + $m1->setFrom('user@example.com'); + $m2 = clone $m1; + $m1->setTo(['user1@example.com' => 'user1']); + $m2->setTo(['user2@example.com' => 'user2']); + + $this->assertEquals(['user1@example.com' => 'user1'], $m1->getTo()); + $this->assertEquals(['user2@example.com' => 'user2'], $m2->getTo()); + + $messageWithoutSwiftInitialized = new Message(); + $m2 = clone $messageWithoutSwiftInitialized; // should be no error during cloning + $this->assertTrue($m2 instanceof Message); + } + + /** * @depends testGetSwiftMessage */ public function testSetupHeaderShortcuts()