OpenXE/classes/Components/Filesystem/PathInfo.php

222 lines
4.3 KiB
PHP
Raw Normal View History

2021-05-21 08:49:41 +02:00
<?php
namespace Xentral\Components\Filesystem;
use League\Flysystem\Util;
use Xentral\Components\Filesystem\Exception\InvalidArgumentException;
final class PathInfo
{
const TYPE_FILE = 'file';
const TYPE_DIR = 'dir';
/** @var array $readonlyProperties */
private static $readonlyProperties = [
'type',
'path',
'dirname',
'filename',
'basename',
'extension',
'timestamp',
'size',
];
/** @var array $data */
private $data;
/**
* @param array $data
*/
public function __construct(array $data)
{
// required
$data['type'] = (string)$data['type'];
$data['path'] = (string)$data['path'];
$data['dirname'] = (string)$data['dirname'];
$data['filename'] = (string)$data['filename'];
$data['basename'] = (string)$data['basename'];
// optional
$data['extension'] = !empty($data['extension']) ? (string)$data['extension'] : null;
$data['timestamp'] = is_numeric($data['timestamp']) ? (int)$data['timestamp'] : null;
$data['size'] = is_numeric($data['size']) ? (int)$data['size'] : null;
$this->data = $data;
}
/**
* @param array $metainfo
*
* @return PathInfo
*/
public static function fromMeta(array $metainfo = [])
{
$pathinfo = Util::pathinfo($metainfo['path']);
return new PathInfo(array_merge($pathinfo, $metainfo));
}
/**
* @return array
*/
public function toArray()
{
return $this->data;
}
/**
* @return bool
*/
public function isFile()
{
return $this->getType() === self::TYPE_FILE;
}
/**
* @return bool
*/
public function isDir()
{
return $this->getType() === self::TYPE_DIR;
}
/**
* @return string [dir|file]
*/
public function getType()
{
return $this->data['type'];
}
/**
* @return string Filename with extension and without path
*/
public function getBasename()
{
return $this->data['basename'];
}
/**
* @return string Filename without extension and without path
*/
public function getFilename()
{
return $this->data['filename'];
}
/**
* @return string|null File extension or null if directory
*/
public function getExtension()
{
return $this->data['extension'];
}
/**
* @return string Path without filename
*/
public function getDir()
{
return $this->data['dirname'];
}
/**
* Relativer Pfad zum Mountpoint
*
* @return string Path with filename
*/
public function getPath()
{
return $this->data['path'];
}
/**
* @return int|null File size or null if not available
*/
public function getSize()
{
return $this->data['size'];
}
/**
* @return int|null Last updated timestamp or null if not available
*/
public function getTimestamp()
{
return $this->data['timestamp'];
}
/**
* @param string $name
*
* @return bool
*/
public function has($name)
{
return isset($this->data[(string)$name]);
}
/**
* @param string $name
*
* @return mixed
*/
public function get($name)
{
if ($this->has($name)) {
return $this->data[(string)$name];
}
return null;
}
/**
* @param string $name
* @param mixed $value
*
* @throws InvalidArgumentException
*
* @return void
*/
public function set($name, $value)
{
if (in_array((string)$name, self::$readonlyProperties, true)) {
throw new InvalidArgumentException(sprintf('Property "%s" is readonly.', $name));
}
$this->data[(string)$name] = $value;
}
/**
* @param string $name
*
* @return bool
*/
public function __isset($name)
{
return $this->has($name);
}
/**
* @param string $name
*
* @return mixed
*/
public function __get($name)
{
return $this->get($name);
}
/**
* @param string $name
* @param mixed $value
*
* @return void
*/
public function __set($name, $value)
{
$this->set($name, $value);
}
}