4 * This file is part of the Symfony package.
6 * (c) Fabien Potencier <fabien@symfony.com>
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
12 namespace Symfony\Component\Config\Resource;
15 * DirectoryResource represents a resources stored in a subdirectory tree.
17 * @author Fabien Potencier <fabien@symfony.com>
19 class DirectoryResource implements SelfCheckingResourceInterface, \Serializable
27 * @param string $resource The file path to the resource
28 * @param string|null $pattern A pattern to restrict monitored files
30 public function __construct($resource, $pattern = null)
32 $this->resource = $resource;
33 $this->pattern = $pattern;
39 public function __toString()
41 return md5(serialize(array($this->resource, $this->pattern)));
47 public function getResource()
49 return $this->resource;
53 * Returns the pattern to restrict monitored files.
57 public function getPattern()
59 return $this->pattern;
65 public function isFresh($timestamp)
67 if (!is_dir($this->resource)) {
71 if ($timestamp < filemtime($this->resource)) {
75 foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($this->resource), \RecursiveIteratorIterator::SELF_FIRST) as $file) {
76 // if regex filtering is enabled only check matching files
77 if ($this->pattern && $file->isFile() && !preg_match($this->pattern, $file->getBasename())) {
81 // always monitor directories for changes, except the .. entries
82 // (otherwise deleted files wouldn't get detected)
83 if ($file->isDir() && '/..' === substr($file, -3)) {
89 $fileMTime = $file->getMTime();
90 } catch (\RuntimeException $e) {
94 // early return if a file's mtime exceeds the passed timestamp
95 if ($timestamp < $fileMTime) {
103 public function serialize()
105 return serialize(array($this->resource, $this->pattern));
108 public function unserialize($serialized)
110 list($this->resource, $this->pattern) = unserialize($serialized);