1: <?php
2: /**
3: * CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
4: * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
5: *
6: * Licensed under The MIT License
7: * For full copyright and license information, please see the LICENSE.txt
8: * Redistributions of files must retain the above copyright notice.
9: *
10: * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
11: * @link https://cakephp.org CakePHP(tm) Project
12: * @since 3.7.0
13: * @license https://opensource.org/licenses/mit-license.php MIT License
14: */
15: namespace Cake\Mailer;
16:
17: use Cake\Core\StaticConfigTrait;
18: use InvalidArgumentException;
19:
20: /**
21: * Factory class for generating email transport instances.
22: */
23: class TransportFactory
24: {
25: use StaticConfigTrait;
26:
27: /**
28: * Transport Registry used for creating and using transport instances.
29: *
30: * @var \Cake\Mailer\TransportRegistry
31: */
32: protected static $_registry;
33:
34: /**
35: * An array mapping url schemes to fully qualified Transport class names
36: *
37: * @var array
38: */
39: protected static $_dsnClassMap = [
40: 'debug' => 'Cake\Mailer\Transport\DebugTransport',
41: 'mail' => 'Cake\Mailer\Transport\MailTransport',
42: 'smtp' => 'Cake\Mailer\Transport\SmtpTransport',
43: ];
44:
45: /**
46: * Returns the Transport Registry used for creating and using transport instances.
47: *
48: * @return \Cake\Mailer\TransportRegistry
49: */
50: public static function getRegistry()
51: {
52: if (!static::$_registry) {
53: static::$_registry = new TransportRegistry();
54: }
55:
56: return static::$_registry;
57: }
58:
59: /**
60: * Sets the Transport Registry instance used for creating and using transport instances.
61: *
62: * Also allows for injecting of a new registry instance.
63: *
64: * @param \Cake\Mailer\TransportRegistry $registry Injectable registry object.
65: * @return void
66: */
67: public static function setRegistry(TransportRegistry $registry)
68: {
69: static::$_registry = $registry;
70: }
71:
72: /**
73: * Finds and builds the instance of the required tranport class.
74: *
75: * @param string $name Name of the config array that needs a tranport instance built
76: * @return void
77: * @throws \InvalidArgumentException When a tranport cannot be created.
78: */
79: protected static function _buildTransport($name)
80: {
81: if (!isset(static::$_config[$name])) {
82: throw new InvalidArgumentException(
83: sprintf('The "%s" transport configuration does not exist', $name)
84: );
85: }
86:
87: if (is_array(static::$_config[$name]) && empty(static::$_config[$name]['className'])) {
88: throw new InvalidArgumentException(
89: sprintf('Transport config "%s" is invalid, the required `className` option is missing', $name)
90: );
91: }
92:
93: static::getRegistry()->load($name, static::$_config[$name]);
94: }
95:
96: /**
97: * Get transport instance.
98: *
99: * @param string $name Config name.
100: * @return \Cake\Mailer\AbstractTransport
101: */
102: public static function get($name)
103: {
104: $registry = static::getRegistry();
105:
106: if (isset($registry->{$name})) {
107: return $registry->{$name};
108: }
109:
110: static::_buildTransport($name);
111:
112: return $registry->{$name};
113: }
114: }
115: