Open Monograph Press  3.3.0
Headers.php
1 <?php
2 
3 /*
4  * This file is part of the Symfony package.
5  *
6  * (c) Fabien Potencier <fabien@symfony.com>
7  *
8  * For the full copyright and license information, please view the LICENSE
9  * file that was distributed with this source code.
10  */
11 
13 
16 
22 final class Headers
23 {
24  private static $uniqueHeaders = [
25  'date', 'from', 'sender', 'reply-to', 'to', 'cc', 'bcc',
26  'message-id', 'in-reply-to', 'references', 'subject',
27  ];
28 
29  private $headers = [];
30  private $lineLength = 76;
31 
32  public function __construct(HeaderInterface ...$headers)
33  {
34  foreach ($headers as $header) {
35  $this->add($header);
36  }
37  }
38 
39  public function __clone()
40  {
41  foreach ($this->headers as $name => $collection) {
42  foreach ($collection as $i => $header) {
43  $this->headers[$name][$i] = clone $header;
44  }
45  }
46  }
47 
48  public function setMaxLineLength(int $lineLength)
49  {
50  $this->lineLength = $lineLength;
51  foreach ($this->all() as $header) {
52  $header->setMaxLineLength($lineLength);
53  }
54  }
55 
56  public function getMaxLineLength(): int
57  {
58  return $this->lineLength;
59  }
60 
66  public function addMailboxListHeader(string $name, array $addresses): self
67  {
68  return $this->add(new MailboxListHeader($name, Address::createArray($addresses)));
69  }
70 
76  public function addMailboxHeader(string $name, $address): self
77  {
78  return $this->add(new MailboxHeader($name, Address::create($address)));
79  }
80 
86  public function addIdHeader(string $name, $ids): self
87  {
88  return $this->add(new IdentificationHeader($name, $ids));
89  }
90 
96  public function addPathHeader(string $name, $path): self
97  {
98  return $this->add(new PathHeader($name, $path instanceof Address ? $path : new Address($path)));
99  }
100 
104  public function addDateHeader(string $name, \DateTimeInterface $dateTime): self
105  {
106  return $this->add(new DateHeader($name, $dateTime));
107  }
108 
112  public function addTextHeader(string $name, string $value): self
113  {
114  return $this->add(new UnstructuredHeader($name, $value));
115  }
116 
120  public function addParameterizedHeader(string $name, string $value, array $params = []): self
121  {
122  return $this->add(new ParameterizedHeader($name, $value, $params));
123  }
124 
125  public function has(string $name): bool
126  {
127  return isset($this->headers[strtolower($name)]);
128  }
129 
133  public function add(HeaderInterface $header): self
134  {
135  static $map = [
136  'date' => DateHeader::class,
137  'from' => MailboxListHeader::class,
138  'sender' => MailboxHeader::class,
139  'reply-to' => MailboxListHeader::class,
140  'to' => MailboxListHeader::class,
141  'cc' => MailboxListHeader::class,
142  'bcc' => MailboxListHeader::class,
143  'message-id' => IdentificationHeader::class,
144  'in-reply-to' => IdentificationHeader::class,
145  'references' => IdentificationHeader::class,
146  'return-path' => PathHeader::class,
147  ];
148 
149  $header->setMaxLineLength($this->lineLength);
150  $name = strtolower($header->getName());
151 
152  if (isset($map[$name]) && !$header instanceof $map[$name]) {
153  throw new LogicException(sprintf('The "%s" header must be an instance of "%s" (got "%s").', $header->getName(), $map[$name], \get_class($header)));
154  }
155 
156  if (\in_array($name, self::$uniqueHeaders, true) && isset($this->headers[$name]) && \count($this->headers[$name]) > 0) {
157  throw new LogicException(sprintf('Impossible to set header "%s" as it\'s already defined and must be unique.', $header->getName()));
158  }
159 
160  $this->headers[$name][] = $header;
161 
162  return $this;
163  }
164 
165  public function get(string $name): ?HeaderInterface
166  {
167  $name = strtolower($name);
168  if (!isset($this->headers[$name])) {
169  return null;
170  }
171 
172  $values = array_values($this->headers[$name]);
173 
174  return array_shift($values);
175  }
176 
177  public function all(string $name = null): iterable
178  {
179  if (null === $name) {
180  foreach ($this->headers as $name => $collection) {
181  foreach ($collection as $header) {
182  yield $name => $header;
183  }
184  }
185  } elseif (isset($this->headers[strtolower($name)])) {
186  foreach ($this->headers[strtolower($name)] as $header) {
187  yield $header;
188  }
189  }
190  }
191 
192  public function getNames(): array
193  {
194  return array_keys($this->headers);
195  }
196 
197  public function remove(string $name): void
198  {
199  unset($this->headers[strtolower($name)]);
200  }
201 
202  public static function isUniqueHeader(string $name): bool
203  {
204  return \in_array($name, self::$uniqueHeaders, true);
205  }
206 
207  public function toString(): string
208  {
209  $string = '';
210  foreach ($this->toArray() as $str) {
211  $string .= $str."\r\n";
212  }
213 
214  return $string;
215  }
216 
217  public function toArray(): array
218  {
219  $arr = [];
220  foreach ($this->all() as $header) {
221  if ('' !== $header->getBodyAsString()) {
222  $arr[] = $header->toString();
223  }
224  }
225 
226  return $arr;
227  }
228 
232  public function getHeaderBody($name)
233  {
234  return $this->has($name) ? $this->get($name)->getBody() : null;
235  }
236 
240  public function setHeaderBody(string $type, string $name, $body): void
241  {
242  if ($this->has($name)) {
243  $this->get($name)->setBody($body);
244  } else {
245  $this->{'add'.$type.'Header'}($name, $body);
246  }
247  }
248 
252  public function getHeaderParameter(string $name, string $parameter): ?string
253  {
254  if (!$this->has($name)) {
255  return null;
256  }
257 
258  $header = $this->get($name);
259  if (!$header instanceof ParameterizedHeader) {
260  throw new LogicException(sprintf('Unable to get parameter "%s" on header "%s" as the header is not of class "%s".', $parameter, $name, ParameterizedHeader::class));
261  }
262 
263  return $header->getParameter($parameter);
264  }
265 
269  public function setHeaderParameter(string $name, string $parameter, $value): void
270  {
271  if (!$this->has($name)) {
272  throw new LogicException(sprintf('Unable to set parameter "%s" on header "%s" as the header is not defined.', $parameter, $name));
273  }
274 
275  $header = $this->get($name);
276  if (!$header instanceof ParameterizedHeader) {
277  throw new LogicException(sprintf('Unable to set parameter "%s" on header "%s" as the header is not of class "%s".', $parameter, $name, ParameterizedHeader::class));
278  }
279 
280  $header->setParameter($parameter, $value);
281  }
282 }
Symfony\Component\Mime\Header\HeaderInterface
Definition: vendor/symfony/mime/Header/HeaderInterface.php:19
Symfony\Component\Mime\Header\Headers\setHeaderParameter
setHeaderParameter(string $name, string $parameter, $value)
Definition: Headers.php:269
Symfony\Component\Mime\Header\Headers\addTextHeader
addTextHeader(string $name, string $value)
Definition: Headers.php:112
Symfony\Component\Mime\Header\Headers\addParameterizedHeader
addParameterizedHeader(string $name, string $value, array $params=[])
Definition: Headers.php:120
Symfony\Component\Mime\Address\create
static create($address)
Definition: Address.php:86
Symfony\Component\Mime\Header\Headers\__clone
__clone()
Definition: Headers.php:39
Symfony\Component\Mime\Header\Headers\toArray
toArray()
Definition: Headers.php:217
Symfony\Component\Mime\Header\Headers\addDateHeader
addDateHeader(string $name, \DateTimeInterface $dateTime)
Definition: Headers.php:104
Symfony\Component\Mime\Header\Headers\addMailboxHeader
addMailboxHeader(string $name, $address)
Definition: Headers.php:76
Symfony\Component\Mime\Header\Headers\addPathHeader
addPathHeader(string $name, $path)
Definition: Headers.php:96
Symfony\Component\Mime\Header\Headers\toString
toString()
Definition: Headers.php:207
Symfony\Component\Mime\Header\Headers\addMailboxListHeader
addMailboxListHeader(string $name, array $addresses)
Definition: Headers.php:66
Symfony\Component\Mime\Header\Headers\isUniqueHeader
static isUniqueHeader(string $name)
Definition: Headers.php:202
Symfony\Component\Mime\Header\Headers\getHeaderParameter
getHeaderParameter(string $name, string $parameter)
Definition: Headers.php:252
Symfony\Component\Mime\Header\PathHeader
Definition: PathHeader.php:22
Symfony\Component\Mime\Header\Headers\has
has(string $name)
Definition: Headers.php:125
Symfony\Component\Mime\Address
Definition: Address.php:24
Symfony\Component\Mime\Header\UnstructuredHeader
Definition: UnstructuredHeader.php:19
Symfony\Component\Mime\Header\IdentificationHeader
Definition: IdentificationHeader.php:22
Symfony\Component\Mime\Header\Headers\__construct
__construct(HeaderInterface ... $headers)
Definition: Headers.php:32
Symfony\Component\Mime\Header\Headers\getMaxLineLength
getMaxLineLength()
Definition: Headers.php:56
Symfony\Component\Mime\Header\HeaderInterface\setMaxLineLength
setMaxLineLength(int $lineLength)
Symfony\Component\Mime\Header\Headers\all
all(string $name=null)
Definition: Headers.php:177
Symfony\Component\Mime\Header\ParameterizedHeader
Definition: ParameterizedHeader.php:19
Symfony\Component\Mime\Header
Definition: AbstractHeader.php:12
Symfony\Component\Mime\Header\Headers
Definition: Headers.php:22
Symfony\Component\Mime\Exception\LogicException
Definition: LogicException.php:17
Symfony\Component\Mime\Header\Headers\getNames
getNames()
Definition: Headers.php:192
Symfony\Component\Mime\Address\createArray
static createArray(array $addresses)
Definition: Address.php:103
Symfony\Component\Mime\Header\MailboxHeader
Definition: MailboxHeader.php:22
Symfony\Component\Mime\Header\Headers\add
add(HeaderInterface $header)
Definition: Headers.php:133
Symfony\Component\Mime\Header\Headers\setHeaderBody
setHeaderBody(string $type, string $name, $body)
Definition: Headers.php:240
Symfony\Component\Mime\Header\Headers\setMaxLineLength
setMaxLineLength(int $lineLength)
Definition: Headers.php:48
Symfony\Component\Mime\Header\Headers\getHeaderBody
getHeaderBody($name)
Definition: Headers.php:232
Symfony\Component\Mime\Header\MailboxListHeader
Definition: MailboxListHeader.php:22
Symfony\Component\Mime\Header\HeaderInterface\getName
getName()
Symfony\Component\Mime\Header\Headers\addIdHeader
addIdHeader(string $name, $ids)
Definition: Headers.php:86
Symfony\Component\Mime\Header\DateHeader
Definition: DateHeader.php:19