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: /**
15: * DirectoryResource represents a resources stored in a subdirectory tree.
16: *
17: * @author Fabien Potencier <fabien@symfony.com>
18: */
19: class DirectoryResource implements ResourceInterface, \Serializable
20: {
21: private $resource;
22: private $pattern;
23:
24: /**
25: * Constructor.
26: *
27: * @param string $resource The file path to the resource
28: * @param string $pattern A pattern to restrict monitored files
29: */
30: public function __construct($resource, $pattern = null)
31: {
32: $this->resource = $resource;
33: $this->pattern = $pattern;
34: }
35:
36: /**
37: * Returns a string representation of the Resource.
38: *
39: * @return string A string representation of the Resource
40: */
41: public function __toString()
42: {
43: return (string) $this->resource;
44: }
45:
46: /**
47: * Returns the resource tied to this Resource.
48: *
49: * @return mixed The resource
50: */
51: public function getResource()
52: {
53: return $this->resource;
54: }
55:
56: public function getPattern()
57: {
58: return $this->pattern;
59: }
60:
61: /**
62: * Returns true if the resource has not been updated since the given timestamp.
63: *
64: * @param integer $timestamp The last time the resource was loaded
65: *
66: * @return Boolean true if the resource has not been updated, false otherwise
67: */
68: public function isFresh($timestamp)
69: {
70: if (!is_dir($this->resource)) {
71: return false;
72: }
73:
74: $newestMTime = 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())) {
78: continue;
79: }
80:
81: // always monitor directories for changes, except the .. entries
82: // (otherwise deleted files wouldn't get detected)
83: if ($file->isDir() && '/..' === substr($file, -3)) {
84: continue;
85: }
86:
87: $newestMTime = max($file->getMTime(), $newestMTime);
88: }
89:
90: return $newestMTime < $timestamp;
91: }
92:
93: public function serialize()
94: {
95: return serialize(array($this->resource, $this->pattern));
96: }
97:
98: public function unserialize($serialized)
99: {
100: list($this->resource, $this->pattern) = unserialize($serialized);
101: }
102: }
103: