33 parent::__construct();
35 foreach ($fields as $name => $value) {
36 if (!\is_string($value) && !\is_array($value) && !$value instanceof
TextPart) {
37 throw new InvalidArgumentException(sprintf(
'A form field value can only be a string, an array, or an instance of TextPart ("%s" given).', \is_object($value) ? \get_class($value) : \gettype($value)));
40 $this->fields[$name] = $value;
43 $this->
getHeaders()->setMaxLineLength(PHP_INT_MAX);
53 return $this->prepareFields($this->fields);
56 private function prepareFields(array $fields): array
60 $prepare =
function ($item, $key, $root =
null) use (&$values, &$prepare) {
61 $fieldName = $root ? sprintf(
'%s[%s]', $root, $key) : $key;
63 if (\is_array($item)) {
64 array_walk($item, $prepare, $fieldName);
69 $values[] = $this->preparePart($fieldName, $item);
72 array_walk($fields, $prepare);
77 private function preparePart(
string $name, $value): TextPart
79 if (\is_string($value)) {
80 return $this->configurePart($name,
new TextPart($value,
'utf-8',
'plain',
'8bit'));
83 return $this->configurePart($name, $value);
86 private function configurePart(
string $name, TextPart $part): TextPart
91 $r = new \ReflectionProperty(TextPart::class,
'encoding');
92 $r->setAccessible(
true);
95 $part->setDisposition(
'form-data');
96 $part->setName($name);
98 $part->getHeaders()->setMaxLineLength(PHP_INT_MAX);
99 $r->setValue($part,
'8bit');