DirectotyFilter accept() van RecursiveFilterIterator
Ik ben bezig met mijn Delistio.us project maar loop nu tegen een probleem.
In het project bestaat een DirectoryFilter waarin ik mappen en bestanden kan filteren, althans als het werkte.
Ik laadt via de constructor de RecursiveIterator die dan ook waarde bevat van de map waarover geitereerd wordt.
Maar nu wil ik filteren wat ik via de setFilters() heb opgegeven.
De waardes uit de setFilters() zijn gewoon arrays die vanuit een yml bestand komen en dus irelevant zijn voor nu.
Voor het voorbeeld wil ik het bestand .DS_Store filteren wat dus niet lukt.
Ik gebruik de accept() method die van de RecursiveIterator class komt op basis hiervan kan ik, hopelijk, zeggen wat wel en niet in de lijst mag komen staan.
Het resultaat is nu dat hij helemaal niets filtert en alles gewoon lekker erbij zet.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?php
namespace Delistious;
use ArrayIterator;
use Exception;
use FilesystemIterator;
use IteratorAggregate;
use RecursiveCallbackFilterIterator;
use RecursiveDirectoryIterator;
use RecursiveIteratorIterator;
/**
* Class DirectoryReader
*/
class DirectoryReader implements IteratorAggregate
{
/**
* @var
*/
private $directoryPath;
public function __construct(array $config)
{
$this->directoryPath = $config['directory'];
$this->directoryBlackList = $config['directoryBlackList'];
$this->filesBlackList = $config['filesBlackList'];
if( ! is_dir($this->directoryPath)) {
throw new Exception("Directory <code>{$this->directoryPath}</code> doesn't exist");
}
}
/**
* @return RecursiveDirectoryIterator
*/
public function getIterator()
{
$result = array();
$directoryIterator = new RecursiveDirectoryIterator(
$this->directoryPath,
RecursiveDirectoryIterator::SKIP_DOTS
);
$filter = new DirectoryFilter($directoryIterator);
$filter->setFilters($this->directoryBlackList, $this->filesBlackList);
$iteration = new RecursiveIteratorIterator(
$filter,
RecursiveIteratorIterator::SELF_FIRST,
RecursiveIteratorIterator::CATCH_GET_CHILD
);
$iteration->setMaxDepth(1);
foreach ($iteration as $path => $directory) {
$result[] = $directory;
}
return new ArrayIterator($result);
}
}
?>
namespace Delistious;
use ArrayIterator;
use Exception;
use FilesystemIterator;
use IteratorAggregate;
use RecursiveCallbackFilterIterator;
use RecursiveDirectoryIterator;
use RecursiveIteratorIterator;
/**
* Class DirectoryReader
*/
class DirectoryReader implements IteratorAggregate
{
/**
* @var
*/
private $directoryPath;
public function __construct(array $config)
{
$this->directoryPath = $config['directory'];
$this->directoryBlackList = $config['directoryBlackList'];
$this->filesBlackList = $config['filesBlackList'];
if( ! is_dir($this->directoryPath)) {
throw new Exception("Directory <code>{$this->directoryPath}</code> doesn't exist");
}
}
/**
* @return RecursiveDirectoryIterator
*/
public function getIterator()
{
$result = array();
$directoryIterator = new RecursiveDirectoryIterator(
$this->directoryPath,
RecursiveDirectoryIterator::SKIP_DOTS
);
$filter = new DirectoryFilter($directoryIterator);
$filter->setFilters($this->directoryBlackList, $this->filesBlackList);
$iteration = new RecursiveIteratorIterator(
$filter,
RecursiveIteratorIterator::SELF_FIRST,
RecursiveIteratorIterator::CATCH_GET_CHILD
);
$iteration->setMaxDepth(1);
foreach ($iteration as $path => $directory) {
$result[] = $directory;
}
return new ArrayIterator($result);
}
}
?>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php
namespace Delistious;
use RecursiveFilterIterator;
use RecursiveIterator;
/**
* Class DirectoryFilter
*/
class DirectoryFilter extends RecursiveFilterIterator
{
/**
* @var array
*/
private $blackList = [];
/**
* @var array
*/
private $skippedItems = [];
public function __construct(RecursiveIterator $iterator)
{
parent::__construct($iterator);
}
public function setFilters(array $configBlacklist, array $configSkippedItems)
{
$this->blackList = $configBlacklist;
$this->skippedItems = $configSkippedItems;
}
/**
* @return bool
*/
public function accept()
{
if ( in_array($this->current()->getFilename(), $this->skippedItems)) {
return false;
}
return true;
}
}
?>
namespace Delistious;
use RecursiveFilterIterator;
use RecursiveIterator;
/**
* Class DirectoryFilter
*/
class DirectoryFilter extends RecursiveFilterIterator
{
/**
* @var array
*/
private $blackList = [];
/**
* @var array
*/
private $skippedItems = [];
public function __construct(RecursiveIterator $iterator)
{
parent::__construct($iterator);
}
public function setFilters(array $configBlacklist, array $configSkippedItems)
{
$this->blackList = $configBlacklist;
$this->skippedItems = $configSkippedItems;
}
/**
* @return bool
*/
public function accept()
{
if ( in_array($this->current()->getFilename(), $this->skippedItems)) {
return false;
}
return true;
}
}
?>
Je zou kunnen var_dumpen wat de waarde is van de expressie in accept(), de waarde van getFilename() en de waarde van skippedItems. Als dat allemaal klopt, weet je dat de fout niet in de Iterator zit. Als het niet klopt, dan heb meteen de oorzaak van het probleem :)
Daarna kun je natuurlijk gewoon return !in_array($this->current()->getFilename(), $this->skippedItems); schrijven :)
Maar nee het klopt echt haha
http://php.net/manual/en/splfileinfo.getfilename.php
Verder als ik var_dump kreeg ik de bestandsnaam netjes te zien maar het lijkt wel of hij het niet accept ofzo?
Het is toch zo dat de accept method een true of false moet terugeven? Althans dat las ik wel dacht ik zo.
Jullie kunnen het ook clonen, zal een branch aanmaken hiervoor.
git clone -b phphulp [email protected]:rickdgraaff/delistious.git
Check de branch "phphulp" uit