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.
<?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);
}
}
?>
<?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;
}
}
?>