[ Index ] |
PHP Cross Reference of phpBB-3.3.10-deutsch |
[Summary view] [Print] [Text view]
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 12 namespace Symfony\Component\Config\Resource; 13 14 use Symfony\Component\Finder\Finder; 15 use Symfony\Component\Finder\Glob; 16 17 /** 18 * GlobResource represents a set of resources stored on the filesystem. 19 * 20 * Only existence/removal is tracked (not mtimes.) 21 * 22 * @author Nicolas Grekas <p@tchwork.com> 23 */ 24 class GlobResource implements \IteratorAggregate, SelfCheckingResourceInterface, \Serializable 25 { 26 private $prefix; 27 private $pattern; 28 private $recursive; 29 private $hash; 30 31 /** 32 * @param string $prefix A directory prefix 33 * @param string $pattern A glob pattern 34 * @param bool $recursive Whether directories should be scanned recursively or not 35 * 36 * @throws \InvalidArgumentException 37 */ 38 public function __construct($prefix, $pattern, $recursive) 39 { 40 $this->prefix = realpath($prefix) ?: (file_exists($prefix) ? $prefix : false); 41 $this->pattern = $pattern; 42 $this->recursive = $recursive; 43 44 if (false === $this->prefix) { 45 throw new \InvalidArgumentException(sprintf('The path "%s" does not exist.', $prefix)); 46 } 47 } 48 49 public function getPrefix() 50 { 51 return $this->prefix; 52 } 53 54 /** 55 * {@inheritdoc} 56 */ 57 public function __toString() 58 { 59 return 'glob.'.$this->prefix.$this->pattern.(int) $this->recursive; 60 } 61 62 /** 63 * {@inheritdoc} 64 */ 65 public function isFresh($timestamp) 66 { 67 $hash = $this->computeHash(); 68 69 if (null === $this->hash) { 70 $this->hash = $hash; 71 } 72 73 return $this->hash === $hash; 74 } 75 76 /** 77 * @internal 78 */ 79 public function serialize() 80 { 81 if (null === $this->hash) { 82 $this->hash = $this->computeHash(); 83 } 84 85 return serialize([$this->prefix, $this->pattern, $this->recursive, $this->hash]); 86 } 87 88 /** 89 * @internal 90 */ 91 public function unserialize($serialized) 92 { 93 list($this->prefix, $this->pattern, $this->recursive, $this->hash) = unserialize($serialized); 94 } 95 96 public function getIterator() 97 { 98 if (!file_exists($this->prefix) || (!$this->recursive && '' === $this->pattern)) { 99 return; 100 } 101 102 if (0 !== strpos($this->prefix, 'phar://') && false === strpos($this->pattern, '/**/') && (\defined('GLOB_BRACE') || false === strpos($this->pattern, '{'))) { 103 $paths = glob($this->prefix.$this->pattern, \GLOB_NOSORT | (\defined('GLOB_BRACE') ? \GLOB_BRACE : 0)); 104 sort($paths); 105 foreach ($paths as $path) { 106 if ($this->recursive && is_dir($path)) { 107 $files = iterator_to_array(new \RecursiveIteratorIterator( 108 new \RecursiveCallbackFilterIterator( 109 new \RecursiveDirectoryIterator($path, \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS), 110 function (\SplFileInfo $file) { return '.' !== $file->getBasename()[0]; } 111 ), 112 \RecursiveIteratorIterator::LEAVES_ONLY 113 )); 114 uasort($files, function (\SplFileInfo $a, \SplFileInfo $b) { 115 return (string) $a > (string) $b ? 1 : -1; 116 }); 117 118 foreach ($files as $path => $info) { 119 if ($info->isFile()) { 120 yield $path => $info; 121 } 122 } 123 } elseif (is_file($path)) { 124 yield $path => new \SplFileInfo($path); 125 } 126 } 127 128 return; 129 } 130 131 if (!class_exists(Finder::class)) { 132 throw new \LogicException(sprintf('Extended glob pattern "%s" cannot be used as the Finder component is not installed.', $this->pattern)); 133 } 134 135 $finder = new Finder(); 136 $regex = Glob::toRegex($this->pattern); 137 if ($this->recursive) { 138 $regex = substr_replace($regex, '(/|$)', -2, 1); 139 } 140 141 $prefixLen = \strlen($this->prefix); 142 foreach ($finder->followLinks()->sortByName()->in($this->prefix) as $path => $info) { 143 if (preg_match($regex, substr('\\' === \DIRECTORY_SEPARATOR ? str_replace('\\', '/', $path) : $path, $prefixLen)) && $info->isFile()) { 144 yield $path => $info; 145 } 146 } 147 } 148 149 private function computeHash() 150 { 151 $hash = hash_init('md5'); 152 153 foreach ($this->getIterator() as $path => $info) { 154 hash_update($hash, $path."\n"); 155 } 156 157 return hash_final($hash); 158 } 159 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Wed Feb 22 20:16:20 2023 | Cross-referenced by PHPXref 0.7.1 |