Source of file FilterComposite.php
Size: 5,939 Bytes - Last Modified: 2014-03-12T23:21:18+01:00
/home/theseer/Downloads/ZendFramework-2.3.0/library/Zend/Stdlib/Hydrator/Filter/FilterComposite.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 | <?php /** * Zend Framework (http://framework.zend.com/) * * @link http://github.com/zendframework/zf2 for the canonical source repository * @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ namespace Zend\Stdlib\Hydrator\Filter; use ArrayObject; use Zend\Stdlib\Exception\InvalidArgumentException; class FilterComposite implements FilterInterface { /** * @var ArrayObject */ protected $orFilter; /** * @var ArrayObject */ protected $andFilter; /** * Constant to add with "or" conditition */ const CONDITION_OR = 1; /** * Constant to add with "and" conditition */ const CONDITION_AND = 2; /** * Define default Filter * * @throws InvalidArgumentException */ public function __construct($orFilter = array(), $andFilter = array()) { array_walk($orFilter, function ($value, $key) { if ( !is_callable($value) && !$value instanceof FilterInterface ) { throw new InvalidArgumentException( 'The value of ' . $key . ' should be either a callable or ' . 'an instance of Zend\Stdlib\Hydrator\Filter\FilterInterface' ); } } ); array_walk($andFilter, function ($value, $key) { if ( !is_callable($value) && !$value instanceof FilterInterface ) { throw new InvalidArgumentException( 'The value of ' . $key . ' should be either a callable or ' . 'an instance of Zend\Stdlib\Hydrator\Filter\FilterInterface' ); } } ); $this->orFilter = new ArrayObject($orFilter); $this->andFilter = new ArrayObject($andFilter); } /** * Add a filter to the composite. Has to be indexed with $name in * order to identify a specific filter. * * This example will exclude all methods from the hydration, that starts with 'getService' * <code> * $composite->addFilter('exclude', * function ($method) { * if (preg_match('/^getService/', $method) { * return false; * } * return true; * }, FilterComposite::CONDITION_AND * ); * </code> * * @param string $name * @param callable|FilterInterface $filter * @param int $condition Can be either FilterComposite::CONDITION_OR or FilterComposite::CONDITION_AND * @throws InvalidArgumentException * @return FilterComposite */ public function addFilter($name, $filter, $condition = self::CONDITION_OR) { if (!is_callable($filter) && !($filter instanceof FilterInterface)) { throw new InvalidArgumentException( 'The value of ' . $name . ' should be either a callable or ' . 'an instance of Zend\Stdlib\Hydrator\Filter\FilterInterface' ); } if ($condition === self::CONDITION_OR) { $this->orFilter[$name] = $filter; } elseif ($condition === self::CONDITION_AND) { $this->andFilter[$name] = $filter; } return $this; } /** * Remove a filter from the composition * * @param $name string Identifier for the filter * @return FilterComposite */ public function removeFilter($name) { if (isset($this->orFilter[$name])) { unset($this->orFilter[$name]); } if (isset($this->andFilter[$name])) { unset($this->andFilter[$name]); } return $this; } /** * Check if $name has a filter registered * * @param $name string Identifier for the filter * @return bool */ public function hasFilter($name) { return isset($this->orFilter[$name]) || isset($this->andFilter[$name]); } /** * Filter the composite based on the AND and OR condition * Will return true if one from the "or conditions" and all from * the "and condition" returns true. Otherwise false * * @param $property string Parameter will be e.g. Parent\Namespace\Class::method * @return bool */ public function filter($property) { $andCount = count($this->andFilter); $orCount = count($this->orFilter); // return true if no filters are registered if ($orCount === 0 && $andCount === 0) { return true; } elseif ($orCount === 0 && $andCount !== 0) { $returnValue = true; } else { $returnValue = false; } // Check if 1 from the or filters return true foreach ($this->orFilter as $filter) { if (is_callable($filter)) { if ($filter($property) === true) { $returnValue = true; break; } continue; } else { if ($filter->filter($property) === true) { $returnValue = true; break; } } } // Check if all of the and condition return true foreach ($this->andFilter as $filter) { if (is_callable($filter)) { if ($filter($property) === false) { return false; } continue; } else { if ($filter->filter($property) === false) { return false; } } } return $returnValue; } } |