Browse Source

Add `MailerAwareTrait`

Jad Bitar 10 years ago
parent
commit
ccdf9c0b8f

+ 27 - 0
src/Mailer/Exception/MissingMailerException.php

@@ -0,0 +1,27 @@
+<?php
+/**
+ * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
+ * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+ *
+ * Licensed under The MIT License
+ * For full copyright and license information, please see the LICENSE.txt
+ * Redistributions of files must retain the above copyright notice.
+ *
+ * @copyright     Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+ * @link          http://cakephp.org CakePHP(tm) Project
+ * @since         3.1.0
+ * @license       http://www.opensource.org/licenses/mit-license.php MIT License
+ */
+namespace Cake\Mailer\Exception;
+
+use Cake\Core\Exception\Exception;
+
+/**
+ * Used when a mailer cannot be found.
+ *
+ */
+class MissingMailerException extends Exception
+{
+
+    protected $_messageTemplate = 'Mailer class "%s" could not be found.';
+}

+ 64 - 0
src/Mailer/MailerAwareTrait.php

@@ -0,0 +1,64 @@
+<?php
+/**
+ * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
+ * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+ *
+ * Licensed under The MIT License
+ * For full copyright and license information, please see the LICENSE.txt
+ * Redistributions of files must retain the above copyright notice.
+ *
+ * @copyright     Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+ * @link          http://cakephp.org CakePHP(tm) Project
+ * @since         3.1.0
+ * @license       http://www.opensource.org/licenses/mit-license.php MIT License
+ */
+namespace Cake\Mailer;
+
+use Cake\Core\App;
+use Cake\Mailer\Exception\MissingMailerException;
+use Cake\Mailer\Email;
+use InvalidArgumentException;
+
+/**
+ * Provides functionality for loading mailer classes
+ * onto properties of the host object.
+ *
+ * Example users of this trait are Cake\Controller\Controller and
+ * Cake\Console\Shell.
+ */
+trait MailerAwareTrait
+{
+    /**
+     * Instantiated mailers' stack.
+     *
+     * @var array
+     */
+    protected $_mailers = [];
+
+    /**
+     * Returns a mailer instance.
+     *
+     * @param string $name Mailer's name.
+     * @param Cake\Mailer\Email|null $email Email instance.
+     * @return Cake\Mailer\Mailer
+     * @throws Cake\Mailer\Exception\MissingMailerException if undefined mailer class.
+     */
+    public function getMailer($name, Email $email = null)
+    {
+        if (isset($this->_mailers[$name])) {
+            return $this->_mailers[$name];
+        }
+
+        if (is_null($email)) {
+            $email = new Email();
+        }
+
+        $className = App::className($name, 'Mailer', 'Mailer');
+
+        if (empty($className) || !class_exists($className)) {
+            throw new MissingMailerException(compact('name'));
+        }
+
+        return (new $className($email));
+    }
+}

+ 62 - 0
tests/TestCase/Mailer/MailerAwareTraitTest.php

@@ -0,0 +1,62 @@
+<?php
+/**
+ * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
+ * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+ *
+ * Licensed under The MIT License
+ * Redistributions of files must retain the above copyright notice.
+ *
+ * @copyright     Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+ * @link          http://cakephp.org CakePHP(tm) Project
+ * @since         3.1.0
+ * @license       http://www.opensource.org/licenses/mit-license.php MIT License
+ */
+namespace Cake\Test\TestCase\Mailer;
+
+use Cake\Core\Configure;
+use Cake\Mailer\MailerAwareTrait;
+use Cake\TestSuite\TestCase;
+
+/**
+ * Testing stub.
+ */
+class Stub
+{
+
+    use MailerAwareTrait;
+
+}
+
+/**
+ * MailerAwareTrait test case
+ */
+class MailerAwareTraitTest extends TestCase
+{
+
+
+    /**
+     * Test getMailer
+     *
+     * @return void
+     */
+    public function testGetMailer()
+    {
+        $originalAppNamespace = Configure::read('App.namespace');
+        Configure::write('App.namespace', 'TestApp');
+        $stub = new Stub();
+        $this->assertInstanceOf('TestApp\Mailer\TestMailer', $stub->getMailer('Test'));
+        Configure::write('App.namespace', $originalAppNamespace);
+    }
+
+    /**
+     * Test exception thrown by getMailer.
+     *
+     * @expectedException Cake\Mailer\Exception\MissingMailerException
+     * @expectedExceptionMessage Mailer class "Test" could not be found.
+     */
+    public function testGetMailerThrowsException()
+    {
+        $stub = new Stub();
+        $stub->getMailer('Test');
+    }
+}