Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. DataPart.php

class DataPart

@author Fabien Potencier <fabien@symfony.com>

Hierarchy

  • class \Symfony\Component\Mime\Part\AbstractPart
    • class \Symfony\Component\Mime\Part\TextPart extends \Symfony\Component\Mime\Part\AbstractPart
      • class \Symfony\Component\Mime\Part\DataPart extends \Symfony\Component\Mime\Part\TextPart

Expanded class hierarchy of DataPart

5 files declare their use of DataPart
Email.php in vendor/symfony/mime/Email.php
FormDataPart.php in vendor/symfony/mime/Part/Multipart/FormDataPart.php
HttpBrowser.php in vendor/symfony/browser-kit/HttpBrowser.php
HttpClientKernel.php in vendor/symfony/http-kernel/HttpClientKernel.php
MessageConverter.php in vendor/symfony/mime/MessageConverter.php

File

vendor/symfony/mime/Part/DataPart.php, line 20

Namespace

Symfony\Component\Mime\Part
View source
class DataPart extends TextPart {
    
    /** @internal */
    protected array $_parent;
    private ?string $filename = null;
    private string $mediaType;
    private ?string $cid = null;
    
    /**
     * @param resource|string|File $body Use a File instance to defer loading the file until rendering
     */
    public function __construct($body, ?string $filename = null, ?string $contentType = null, ?string $encoding = null) {
        if ($body instanceof File && !$filename) {
            $filename = $body->getFilename();
        }
        $contentType ??= $body instanceof File ? $body->getContentType() : 'application/octet-stream';
        [
            $this->mediaType,
            $subtype,
        ] = explode('/', $contentType);
        parent::__construct($body, null, $subtype, $encoding);
        if (null !== $filename) {
            $this->filename = $filename;
            $this->setName($filename);
        }
        $this->setDisposition('attachment');
    }
    public static function fromPath(string $path, ?string $name = null, ?string $contentType = null) : self {
        return new self(new File($path), $name, $contentType);
    }
    
    /**
     * @return $this
     */
    public function asInline() : static {
        return $this->setDisposition('inline');
    }
    
    /**
     * @return $this
     */
    public function setContentId(string $cid) : static {
        if (!str_contains($cid, '@')) {
            throw new InvalidArgumentException(\sprintf('The "%s" CID is invalid as it doesn\'t contain an "@".', $cid));
        }
        $this->cid = $cid;
        return $this;
    }
    public function getContentId() : string {
        return $this->cid ?: ($this->cid = $this->generateContentId());
    }
    public function hasContentId() : bool {
        return null !== $this->cid;
    }
    public function getMediaType() : string {
        return $this->mediaType;
    }
    public function getPreparedHeaders() : Headers {
        $headers = parent::getPreparedHeaders();
        if (null !== $this->cid) {
            $headers->setHeaderBody('Id', 'Content-ID', $this->cid);
        }
        if (null !== $this->filename) {
            $headers->setHeaderParameter('Content-Disposition', 'filename', $this->filename);
        }
        return $headers;
    }
    public function asDebugString() : string {
        $str = parent::asDebugString();
        if (null !== $this->filename) {
            $str .= ' filename: ' . $this->filename;
        }
        return $str;
    }
    public function getFilename() : ?string {
        return $this->filename;
    }
    public function getContentType() : string {
        return implode('/', [
            $this->getMediaType(),
            $this->getMediaSubtype(),
        ]);
    }
    private function generateContentId() : string {
        return bin2hex(random_bytes(16)) . '@symfony';
    }
    public function __sleep() : array {
        // converts the body to a string
        parent::__sleep();
        $this->_parent = [];
        foreach ([
            'body',
            'charset',
            'subtype',
            'disposition',
            'name',
            'encoding',
        ] as $name) {
            $r = new \ReflectionProperty(TextPart::class, $name);
            $this->_parent[$name] = $r->getValue($this);
        }
        $this->_headers = $this->getHeaders();
        return [
            '_headers',
            '_parent',
            'filename',
            'mediaType',
        ];
    }
    public function __wakeup() : void {
        $r = new \ReflectionProperty(AbstractPart::class, 'headers');
        $r->setValue($this, $this->_headers);
        unset($this->_headers);
        if (!\is_array($this->_parent)) {
            throw new \BadMethodCallException('Cannot unserialize ' . __CLASS__);
        }
        foreach ([
            'body',
            'charset',
            'subtype',
            'disposition',
            'name',
            'encoding',
        ] as $name) {
            if (null !== $this->_parent[$name] && !\is_string($this->_parent[$name]) && !$this->_parent[$name] instanceof File) {
                throw new \BadMethodCallException('Cannot unserialize ' . __CLASS__);
            }
            $r = new \ReflectionProperty(TextPart::class, $name);
            $r->setValue($this, $this->_parent[$name]);
        }
        unset($this->_parent);
    }

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title Overrides
AbstractPart::$headers private property
AbstractPart::getHeaders public function
AbstractPart::toIterable public function
AbstractPart::toString public function
DataPart::$cid private property
DataPart::$filename private property
DataPart::$mediaType private property
DataPart::$_parent protected property @internal
DataPart::asDebugString public function Overrides TextPart::asDebugString
DataPart::asInline public function
DataPart::fromPath public static function
DataPart::generateContentId private function
DataPart::getContentId public function
DataPart::getContentType public function
DataPart::getFilename public function
DataPart::getMediaType public function Overrides TextPart::getMediaType 1
DataPart::getPreparedHeaders public function Overrides TextPart::getPreparedHeaders
DataPart::hasContentId public function
DataPart::setContentId public function
DataPart::__construct public function Overrides TextPart::__construct 1
DataPart::__sleep public function Overrides TextPart::__sleep 1
DataPart::__wakeup public function Overrides TextPart::__wakeup 1
TextPart::$body private property @var resource|string|File
TextPart::$charset private property
TextPart::$disposition private property
TextPart::$encoders private static property
TextPart::$encoding private property
TextPart::$name private property
TextPart::$seekable private property
TextPart::$subtype private property
TextPart::$_headers protected property @internal
TextPart::addEncoder public static function
TextPart::bodyToIterable public function Overrides AbstractPart::bodyToIterable 1
TextPart::bodyToString public function Overrides AbstractPart::bodyToString 1
TextPart::chooseEncoding private function
TextPart::DEFAULT_ENCODERS private constant
TextPart::getBody public function 1
TextPart::getDisposition public function
TextPart::getEncoder private function
TextPart::getMediaSubtype public function Overrides AbstractPart::getMediaSubtype 1
TextPart::getName public function Gets the name of the file.
TextPart::setDisposition public function
TextPart::setName public function Sets the name of the file (used by FormDataPart).
RSS feed
Powered by Drupal