Skip to content
This repository was archived by the owner on Feb 21, 2020. It is now read-only.

Commit 2eb04e8

Browse files
committed
Drop dependency on zendframework/zend-loader
zendframework#186
1 parent 398bc5a commit 2eb04e8

File tree

5 files changed

+170
-109
lines changed

5 files changed

+170
-109
lines changed

composer.json

-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
"require": {
1919
"php": "^5.6 || ^7.0",
2020
"ext-iconv": "*",
21-
"zendframework/zend-loader": "^2.5",
2221
"zendframework/zend-mime": "^2.5",
2322
"zendframework/zend-stdlib": "^2.7 || ^3.0",
2423
"zendframework/zend-validator": "^2.10.2",

src/Header/HeaderLoader.php

+59-31
Original file line numberDiff line numberDiff line change
@@ -7,39 +7,67 @@
77

88
namespace Zend\Mail\Header;
99

10-
use Zend\Loader\PluginClassLoader;
11-
12-
/**
13-
* Plugin Class Loader implementation for HTTP headers
14-
*/
15-
class HeaderLoader extends PluginClassLoader
10+
class HeaderLoader
1611
{
1712
/**
18-
* @var array Pre-aliased Header plugins
13+
* @var array Pre-aliased Header classes
1914
*/
20-
protected $plugins = [
21-
'bcc' => 'Zend\Mail\Header\Bcc',
22-
'cc' => 'Zend\Mail\Header\Cc',
23-
'contenttype' => 'Zend\Mail\Header\ContentType',
24-
'content_type' => 'Zend\Mail\Header\ContentType',
25-
'content-type' => 'Zend\Mail\Header\ContentType',
26-
'contenttransferencoding' => 'Zend\Mail\Header\ContentTransferEncoding',
27-
'content_transfer_encoding' => 'Zend\Mail\Header\ContentTransferEncoding',
28-
'content-transfer-encoding' => 'Zend\Mail\Header\ContentTransferEncoding',
29-
'date' => 'Zend\Mail\Header\Date',
30-
'from' => 'Zend\Mail\Header\From',
31-
'in-reply-to' => 'Zend\Mail\Header\InReplyTo',
32-
'message-id' => 'Zend\Mail\Header\MessageId',
33-
'mimeversion' => 'Zend\Mail\Header\MimeVersion',
34-
'mime_version' => 'Zend\Mail\Header\MimeVersion',
35-
'mime-version' => 'Zend\Mail\Header\MimeVersion',
36-
'received' => 'Zend\Mail\Header\Received',
37-
'references' => 'Zend\Mail\Header\References',
38-
'replyto' => 'Zend\Mail\Header\ReplyTo',
39-
'reply_to' => 'Zend\Mail\Header\ReplyTo',
40-
'reply-to' => 'Zend\Mail\Header\ReplyTo',
41-
'sender' => 'Zend\Mail\Header\Sender',
42-
'subject' => 'Zend\Mail\Header\Subject',
43-
'to' => 'Zend\Mail\Header\To',
15+
private $headerClassMap = [
16+
'bcc' => Bcc::class,
17+
'cc' => Cc::class,
18+
'contenttype' => ContentType::class,
19+
'content_type' => ContentType::class,
20+
'content-type' => ContentType::class,
21+
'contenttransferencoding' => ContentTransferEncoding::class,
22+
'content_transfer_encoding' => ContentTransferEncoding::class,
23+
'content-transfer-encoding' => ContentTransferEncoding::class,
24+
'date' => Date::class,
25+
'from' => From::class,
26+
'message-id' => MessageId::class,
27+
'mimeversion' => MimeVersion::class,
28+
'mime_version' => MimeVersion::class,
29+
'mime-version' => MimeVersion::class,
30+
'received' => Received::class,
31+
'replyto' => ReplyTo::class,
32+
'reply_to' => ReplyTo::class,
33+
'reply-to' => ReplyTo::class,
34+
'sender' => Sender::class,
35+
'subject' => Subject::class,
36+
'to' => To::class,
4437
];
38+
39+
/**
40+
* @param string $name
41+
* @param string|null $default
42+
* @return string|null
43+
*/
44+
public function get($name, $default = null)
45+
{
46+
$name = $this->normalizeName($name);
47+
return isset($this->headerClassMap[$name]) ? $this->headerClassMap[$name] : $default;
48+
}
49+
50+
/**
51+
* @param string $name
52+
* @return bool
53+
*/
54+
public function has($name)
55+
{
56+
return isset($this->headerClassMap[$this->normalizeName($name)]);
57+
}
58+
59+
public function add($name, $class)
60+
{
61+
$this->headerClassMap[$this->normalizeName($name)] = $class;
62+
}
63+
64+
public function remove($name)
65+
{
66+
unset($this->headerClassMap[$this->normalizeName($name)]);
67+
}
68+
69+
private function normalizeName($name)
70+
{
71+
return strtolower($name);
72+
}
4573
}

src/Headers.php

+16-39
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,6 @@
1111
use Countable;
1212
use Iterator;
1313
use Traversable;
14-
use Zend\Loader\PluginClassLocator;
15-
use Zend\Mail\Header\GenericHeader;
16-
use Zend\Mail\Header\HeaderInterface;
1714

1815
/**
1916
* Basic mail headers collection functionality
@@ -29,9 +26,9 @@ class Headers implements Countable, Iterator
2926
const FOLDING = "\r\n ";
3027

3128
/**
32-
* @var \Zend\Loader\PluginClassLoader
29+
* @var Header\HeaderLoader
3330
*/
34-
protected $pluginClassLoader = null;
31+
protected $headerLoader;
3532

3633
/**
3734
* @var array key names for $headers array
@@ -117,31 +114,6 @@ public static function fromString($string, $EOL = self::EOL)
117114
return $headers;
118115
}
119116

120-
/**
121-
* Set an alternate implementation for the PluginClassLoader
122-
*
123-
* @param PluginClassLocator $pluginClassLoader
124-
* @return Headers
125-
*/
126-
public function setPluginClassLoader(PluginClassLocator $pluginClassLoader)
127-
{
128-
$this->pluginClassLoader = $pluginClassLoader;
129-
return $this;
130-
}
131-
132-
/**
133-
* Return an instance of a PluginClassLocator, lazyload and inject map if necessary
134-
*
135-
* @return PluginClassLocator
136-
*/
137-
public function getPluginClassLoader()
138-
{
139-
if ($this->pluginClassLoader === null) {
140-
$this->pluginClassLoader = new Header\HeaderLoader();
141-
}
142-
return $this->pluginClassLoader;
143-
}
144-
145117
/**
146118
* Set the header encoding
147119
*
@@ -356,7 +328,6 @@ public function next()
356328
{
357329
next($this->headers);
358330
}
359-
360331
/**
361332
* Return the current key for this object as an iterator
362333
*
@@ -385,7 +356,6 @@ public function rewind()
385356
{
386357
reset($this->headers);
387358
}
388-
389359
/**
390360
* Return the current value for this iterator, lazy loading it if need be
391361
*
@@ -478,9 +448,7 @@ public function forceLoading()
478448
public function loadHeader($headerLine)
479449
{
480450
list($name, ) = Header\GenericHeader::splitHeaderLine($headerLine);
481-
482-
/** @var HeaderInterface $class */
483-
$class = $this->getPluginClassLoader()->load($name) ?: Header\GenericHeader::class;
451+
$class = $this->resolveHeaderClass($name);
484452
return $class::fromString($headerLine);
485453
}
486454

@@ -493,10 +461,7 @@ protected function lazyLoadHeader($index)
493461
$current = $this->headers[$index];
494462

495463
$key = $this->headersKeys[$index];
496-
497-
/** @var GenericHeader $class */
498-
$class = ($this->getPluginClassLoader()->load($key)) ?: 'Zend\Mail\Header\GenericHeader';
499-
464+
$class = $this->resolveHeaderClass($key);
500465
$encoding = $current->getEncoding();
501466
$headers = $class::fromString($current->toString());
502467
if (is_array($headers)) {
@@ -527,4 +492,16 @@ protected function normalizeFieldName($fieldName)
527492
{
528493
return str_replace(['-', '_', ' ', '.'], '', strtolower($fieldName));
529494
}
495+
496+
/**
497+
* @param string $key
498+
* @return string
499+
*/
500+
private function resolveHeaderClass($key)
501+
{
502+
if ($this->headerLoader === null) {
503+
$this->headerLoader = new Header\HeaderLoader();
504+
}
505+
return $this->headerLoader->get($key, Header\GenericHeader::class);
506+
}
530507
}

test/Header/HeaderLoaderTest.php

+94
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
<?php
2+
/**
3+
* Zend Framework (http://framework.zend.com/)
4+
*
5+
* @link http://github.com/zendframework/zf2 for the canonical source repository
6+
* @copyright Copyright (c) 2005-2018 Zend Technologies USA Inc. (http://www.zend.com)
7+
* @license http://framework.zend.com/license/new-bsd New BSD License
8+
*/
9+
namespace ZendTest\Mail\Header;
10+
11+
use PHPUnit\Framework\TestCase;
12+
use Zend\Mail\Header;
13+
14+
class HeaderLoaderTest extends TestCase
15+
{
16+
/**
17+
* @var Header\HeaderLoader
18+
*/
19+
private $headerLoader;
20+
public function setUp()
21+
{
22+
$this->headerLoader = new Header\HeaderLoader();
23+
}
24+
public function provideHeaderNames()
25+
{
26+
return [
27+
'with existing name' => ['to', Header\To::class],
28+
'with non-existent name' => ['foo', null],
29+
'with default value' => ['foo', Header\GenericHeader::class, Header\GenericHeader::class],
30+
];
31+
}
32+
/**
33+
* @param $name
34+
* @param $expected
35+
* @param $default
36+
* @dataProvider provideHeaderNames
37+
*/
38+
public function testHeaderIsProperlyLoaded($name, $expected, $default = null)
39+
{
40+
$this->assertEquals($expected, $this->headerLoader->get($name, $default));
41+
}
42+
public function testHeaderExistenceIsProperlyChecked()
43+
{
44+
$this->assertTrue($this->headerLoader->has('to'));
45+
$this->assertTrue($this->headerLoader->has('To'));
46+
$this->assertTrue($this->headerLoader->has('Reply_to'));
47+
$this->assertTrue($this->headerLoader->has('SUBJECT'));
48+
$this->assertFalse($this->headerLoader->has('foo'));
49+
$this->assertFalse($this->headerLoader->has('bar'));
50+
}
51+
public function testHeaderCanBeAdded()
52+
{
53+
$this->assertFalse($this->headerLoader->has('foo'));
54+
$this->headerLoader->add('foo', Header\GenericHeader::class);
55+
$this->assertTrue($this->headerLoader->has('foo'));
56+
}
57+
public function testHeaderCanBeRemoved()
58+
{
59+
$this->assertTrue($this->headerLoader->has('to'));
60+
$this->headerLoader->remove('to');
61+
$this->assertFalse($this->headerLoader->has('to'));
62+
}
63+
public static function expectedHeaders()
64+
{
65+
return [
66+
['bcc', Header\Bcc::class],
67+
['cc', Header\Cc::class],
68+
['contenttype', Header\ContentType::class],
69+
['content_type', Header\ContentType::class],
70+
['content-type', Header\ContentType::class],
71+
['date', Header\Date::class],
72+
['from', Header\From::class],
73+
['mimeversion', Header\MimeVersion::class],
74+
['mime_version', Header\MimeVersion::class],
75+
['mime-version', Header\MimeVersion::class],
76+
['received', Header\Received::class],
77+
['replyto', Header\ReplyTo::class],
78+
['reply_to', Header\ReplyTo::class],
79+
['reply-to', Header\ReplyTo::class],
80+
['sender', Header\Sender::class],
81+
['subject', Header\Subject::class],
82+
['to', Header\To::class],
83+
];
84+
}
85+
/**
86+
* @dataProvider expectedHeaders
87+
* @param $name
88+
* @param $class
89+
*/
90+
public function testDefaultHeadersMapResolvesProperHeader($name, $class)
91+
{
92+
$this->assertEquals($class, $this->headerLoader->get($name));
93+
}
94+
}

test/HeadersTest.php

+1-38
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,7 @@ public function testHeadersFromStringFactoryCreatesMultipleObjects()
9797
public function testHeadersFromStringMultiHeaderWillAggregateLazyLoadedHeaders()
9898
{
9999
$headers = new Mail\Headers();
100-
/* @var $pcl \Zend\Loader\PluginClassLoader */
101-
$pcl = $headers->getPluginClassLoader();
102-
$pcl->registerPlugin('foo', 'Zend\Mail\Header\GenericMultiHeader');
103-
$headers->addHeaderLine('foo: bar1,bar2,bar3');
100+
$headers->addHeaderLine('foo', ['[email protected]', '[email protected]', '[email protected]']);
104101
$headers->forceLoading();
105102
$this->assertEquals(3, $headers->count());
106103
}
@@ -354,40 +351,6 @@ public function testToArrayFormatEncoded()
354351
$this->assertEquals($expected, $array);
355352
}
356353

357-
public static function expectedHeaders()
358-
{
359-
return [
360-
['bcc', 'Zend\Mail\Header\Bcc'],
361-
['cc', 'Zend\Mail\Header\Cc'],
362-
['contenttype', 'Zend\Mail\Header\ContentType'],
363-
['content_type', 'Zend\Mail\Header\ContentType'],
364-
['content-type', 'Zend\Mail\Header\ContentType'],
365-
['date', 'Zend\Mail\Header\Date'],
366-
['from', 'Zend\Mail\Header\From'],
367-
['mimeversion', 'Zend\Mail\Header\MimeVersion'],
368-
['mime_version', 'Zend\Mail\Header\MimeVersion'],
369-
['mime-version', 'Zend\Mail\Header\MimeVersion'],
370-
['received', 'Zend\Mail\Header\Received'],
371-
['replyto', 'Zend\Mail\Header\ReplyTo'],
372-
['reply_to', 'Zend\Mail\Header\ReplyTo'],
373-
['reply-to', 'Zend\Mail\Header\ReplyTo'],
374-
['sender', 'Zend\Mail\Header\Sender'],
375-
['subject', 'Zend\Mail\Header\Subject'],
376-
['to', 'Zend\Mail\Header\To'],
377-
];
378-
}
379-
380-
/**
381-
* @dataProvider expectedHeaders
382-
*/
383-
public function testDefaultPluginLoaderIsSeededWithHeaders($plugin, $class)
384-
{
385-
$headers = new Mail\Headers();
386-
$loader = $headers->getPluginClassLoader();
387-
$test = $loader->load($plugin);
388-
$this->assertEquals($class, $test);
389-
}
390-
391354
public function testClone()
392355
{
393356
$headers = new Mail\Headers();

0 commit comments

Comments
 (0)