Вход Регистрация
Файл: vendor/league/flysystem/src/Filesystem.php
Строк: 317
<?php

declare(strict_types=1);

namespace 
LeagueFlysystem;

use 
DateTimeInterface;
use 
Generator;
use 
LeagueFlysystemUrlGenerationShardedPrefixPublicUrlGenerator;
use 
LeagueFlysystemUrlGenerationPrefixPublicUrlGenerator;
use 
LeagueFlysystemUrlGenerationPublicUrlGenerator;
use 
LeagueFlysystemUrlGenerationTemporaryUrlGenerator;
use 
Throwable;

use function 
is_array;

class 
Filesystem implements FilesystemOperator
{
    use 
CalculateChecksumFromStream;

    private 
Config $config;
    private 
PathNormalizer $pathNormalizer;

    public function 
__construct(
        private 
FilesystemAdapter $adapter,
        array 
$config = [],
        
PathNormalizer $pathNormalizer null,
        private ?
PublicUrlGenerator $publicUrlGenerator null,
        private ?
TemporaryUrlGenerator $temporaryUrlGenerator null,
    ) {
        
$this->config = new Config($config);
        
$this->pathNormalizer $pathNormalizer ?: new WhitespacePathNormalizer();
    }

    public function 
fileExists(string $location): bool
    
{
        return 
$this->adapter->fileExists($this->pathNormalizer->normalizePath($location));
    }

    public function 
directoryExists(string $location): bool
    
{
        return 
$this->adapter->directoryExists($this->pathNormalizer->normalizePath($location));
    }

    public function 
has(string $location): bool
    
{
        
$path $this->pathNormalizer->normalizePath($location);

        return 
$this->adapter->fileExists($path) || $this->adapter->directoryExists($path);
    }

    public function 
write(string $locationstring $contents, array $config = []): void
    
{
        
$this->adapter->write(
            
$this->pathNormalizer->normalizePath($location),
            
$contents,
            
$this->config->extend($config)
        );
    }

    public function 
writeStream(string $location$contents, array $config = []): void
    
{
        
/* @var resource $contents */
        
$this->assertIsResource($contents);
        
$this->rewindStream($contents);
        
$this->adapter->writeStream(
            
$this->pathNormalizer->normalizePath($location),
            
$contents,
            
$this->config->extend($config)
        );
    }

    public function 
read(string $location): string
    
{
        return 
$this->adapter->read($this->pathNormalizer->normalizePath($location));
    }

    public function 
readStream(string $location)
    {
        return 
$this->adapter->readStream($this->pathNormalizer->normalizePath($location));
    }

    public function 
delete(string $location): void
    
{
        
$this->adapter->delete($this->pathNormalizer->normalizePath($location));
    }

    public function 
deleteDirectory(string $location): void
    
{
        
$this->adapter->deleteDirectory($this->pathNormalizer->normalizePath($location));
    }

    public function 
createDirectory(string $location, array $config = []): void
    
{
        
$this->adapter->createDirectory(
            
$this->pathNormalizer->normalizePath($location),
            
$this->config->extend($config)
        );
    }

    public function 
listContents(string $locationbool $deep self::LIST_SHALLOW): DirectoryListing
    
{
        
$path $this->pathNormalizer->normalizePath($location);
        
$listing $this->adapter->listContents($path$deep);

        return new 
DirectoryListing($this->pipeListing($location$deep$listing));
    }

    private function 
pipeListing(string $locationbool $deepiterable $listing): Generator
    
{
        try {
            foreach (
$listing as $item) {
                yield 
$item;
            }
        } catch (
Throwable $exception) {
            throw 
UnableToListContents::atLocation($location$deep$exception);
        }
    }

    public function 
move(string $sourcestring $destination, array $config = []): void
    
{
        
$this->adapter->move(
            
$this->pathNormalizer->normalizePath($source),
            
$this->pathNormalizer->normalizePath($destination),
            
$this->config->extend($config)
        );
    }

    public function 
copy(string $sourcestring $destination, array $config = []): void
    
{
        
$this->adapter->copy(
            
$this->pathNormalizer->normalizePath($source),
            
$this->pathNormalizer->normalizePath($destination),
            
$this->config->extend($config)
        );
    }

    public function 
lastModified(string $path): int
    
{
        return 
$this->adapter->lastModified($this->pathNormalizer->normalizePath($path))->lastModified();
    }

    public function 
fileSize(string $path): int
    
{
        return 
$this->adapter->fileSize($this->pathNormalizer->normalizePath($path))->fileSize();
    }

    public function 
mimeType(string $path): string
    
{
        return 
$this->adapter->mimeType($this->pathNormalizer->normalizePath($path))->mimeType();
    }

    public function 
setVisibility(string $pathstring $visibility): void
    
{
        
$this->adapter->setVisibility($this->pathNormalizer->normalizePath($path), $visibility);
    }

    public function 
visibility(string $path): string
    
{
        return 
$this->adapter->visibility($this->pathNormalizer->normalizePath($path))->visibility();
    }

    public function 
publicUrl(string $path, array $config = []): string
    
{
        
$this->publicUrlGenerator ??= $this->resolvePublicUrlGenerator()
            ?: throw 
UnableToGeneratePublicUrl::noGeneratorConfigured($path);
        
$config $this->config->extend($config);

        return 
$this->publicUrlGenerator->publicUrl($path$config);
    }

    public function 
temporaryUrl(string $pathDateTimeInterface $expiresAt, array $config = []): string
    
{
        
$generator $this->temporaryUrlGenerator ?: $this->adapter;

        if (
$generator instanceof TemporaryUrlGenerator) {
            return 
$generator->temporaryUrl($path$expiresAt$this->config->extend($config));
        }

        throw 
UnableToGenerateTemporaryUrl::noGeneratorConfigured($path);
    }

    public function 
checksum(string $path, array $config = []): string
    
{
        
$config $this->config->extend($config);

        if ( ! 
$this->adapter instanceof ChecksumProvider) {
            return 
$this->calculateChecksumFromStream($path$config);
        }

        try {
            return 
$this->adapter->checksum($path$config);
        } catch (
ChecksumAlgoIsNotSupported) {
            return 
$this->calculateChecksumFromStream($path$config);
        }
    }

    private function 
resolvePublicUrlGenerator(): ?PublicUrlGenerator
    
{
        if (
$publicUrl $this->config->get('public_url')) {
            return 
match (true) {
                
is_array($publicUrl) => new ShardedPrefixPublicUrlGenerator($publicUrl),
                default => new 
PrefixPublicUrlGenerator($publicUrl),
            };
        }

        if (
$this->adapter instanceof PublicUrlGenerator) {
            return 
$this->adapter;
        }

        return 
null;
    }

    
/**
     * @param mixed $contents
     */
    
private function assertIsResource($contents): void
    
{
        if (
is_resource($contents) === false) {
            throw new 
InvalidStreamProvided(
                
"Invalid stream provided, expected stream resource, received " gettype($contents)
            );
        } elseif (
$type get_resource_type($contents) !== 'stream') {
            throw new 
InvalidStreamProvided(
                
"Invalid stream provided, expected stream resource, received resource of type " $type
            
);
        }
    }

    
/**
     * @param resource $resource
     */
    
private function rewindStream($resource): void
    
{
        if (
ftell($resource) !== && stream_get_meta_data($resource)['seekable']) {
            
rewind($resource);
        }
    }
}
Онлайн: 1
Реклама