Jelajahi Sumber

[Finder] made the Custom filter accept all PHP callbacks

Fabien Potencier 14 tahun lalu
induk
melakukan
05e75e2712

+ 7 - 2
src/Symfony/Component/Finder/Iterator/CustomFilterIterator.php

@@ -27,10 +27,15 @@ class CustomFilterIterator extends \FilterIterator
      * Constructor.
      *
      * @param \Iterator $iterator The Iterator to filter
-     * @param array     $filters  An array of \Closure
+     * @param array     $filters  An array of PHP callbacks
      */
     public function __construct(\Iterator $iterator, array $filters)
     {
+        foreach ($filters as $filter) {
+            if (!is_callable($filter)) {
+                throw new \InvalidArgumentException('Invalid PHP callback.');
+            }
+        }
         $this->filters = $filters;
 
         parent::__construct($iterator);
@@ -46,7 +51,7 @@ class CustomFilterIterator extends \FilterIterator
         $fileinfo = $this->current();
 
         foreach ($this->filters as $filter) {
-            if (false === $filter($fileinfo)) {
+            if (false === call_user_func($filter, $fileinfo)) {
                 return false;
             }
         }

+ 9 - 0
tests/Symfony/Tests/Component/Finder/Iterator/CustomFilterIteratorTest.php

@@ -17,6 +17,14 @@ require_once __DIR__.'/IteratorTestCase.php';
 
 class CustomFilterIteratorTest extends IteratorTestCase
 {
+    /**
+     * @expectedException \InvalidArgumentException
+     */
+    public function testWithInvalidFilter()
+    {
+        new CustomFilterIterator(new Iterator(), array('foo'));
+    }
+
     /**
      * @dataProvider getAcceptData
      */
@@ -34,6 +42,7 @@ class CustomFilterIteratorTest extends IteratorTestCase
         return array(
             array(array(function (\SplFileInfo $fileinfo) { return false; }), array()),
             array(array(function (\SplFileInfo $fileinfo) { return preg_match('/^test/', $fileinfo) > 0; }), array('test.php', 'test.py')),
+            array(array('is_dir'), array()),
         );
     }
 }