public function getFilter() { $filterComposite = new FilterComposite(); $filterComposite->addFilter("get", new GetFilter()); $excludes = new FilterComposite(); $excludes->addFilter("servicemanager", new MethodMatchFilter("getServiceManager"), FilterComposite::CONDITION_AND); $excludes->addFilter("eventmanager", new MethodMatchFilter("getEventManager"), FilterComposite::CONDITION_AND); $filterComposite->addFilter("excludes", $excludes, FilterComposite::CONDITION_AND); return $filterComposite; }
/** * Executed composite filters if property matches * * @param string $property The name of the property * @return bool */ public function filter($property) { if ($property == $this->property) { return parent::filter($property); } return true; }
/** * (non-PHPdoc) * @see \Zend\Stdlib\Hydrator\ClassMethods::extract() */ public function extract($object) { if (!is_object($object)) { throw new Exception\BadMethodCallException(sprintf('%s expects the provided $object to be a PHP object)', __METHOD__)); } $objectClass = get_class($object); // reset the hydrator's hydrator's cache for this object, as the filter may be per-instance if ($object instanceof FilterProviderInterface) { $this->extractionMethodsCache[$objectClass] = null; } // pass 1 - finding out which properties can be extracted, with which methods (populate hydration cache) if (!isset($this->extractionMethodsCache[$objectClass])) { $this->extractionMethodsCache[$objectClass] = array(); $filter = $this->filterComposite; $methods = get_class_methods($object); if ($object instanceof FilterProviderInterface) { $filter = new FilterComposite(array($object->getFilter()), array(new MethodMatchFilter('getFilter'))); } foreach ($methods as $method) { $methodFqn = $objectClass . '::' . $method; if (!($filter->filter($methodFqn) && $this->callableMethodFilter->filter($methodFqn))) { continue; } $attribute = $method; if (strpos($method, 'get') === 0) { $attribute = substr($method, 3); if (!property_exists($object, $attribute)) { $attribute = lcfirst($attribute); } } $this->extractionMethodsCache[$objectClass][$method] = $attribute; } } #echo '<pre>';print_r($this->extractionMethodsCache[$objectClass]);echo '</pre>';exit; $values = array(); // pass 2 - actually extract data foreach ($this->extractionMethodsCache[$objectClass] as $methodName => $attributeName) { $realAttributeName = $this->extractName($attributeName, $object); if (true === isset($this->fieldsetMap[$realAttributeName])) { $values[$this->fieldsetMap[$realAttributeName]][$realAttributeName] = $this->extractValue($realAttributeName, $object->{$methodName}(), $object); } else { $values[$realAttributeName] = $this->extractValue($realAttributeName, $object->{$methodName}(), $object); } } return $values; }
/** * Create service with name * * @param ServiceLocatorInterface $serviceLocator * @param $name * @param $requestedName * @return mixed */ public function createServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName) { $config = $serviceLocator->get('Config'); $config = $config[self::FACTORY_NAMESPACE][$requestedName]; $filterCollection = new FilterComposite(); $conditionMap = array('and' => FilterComposite::CONDITION_AND, 'or' => FilterComposite::CONDITION_OR); foreach ($config as $property => $filters) { $propertyFilter = new PropertyFilterComposite($property); foreach ($filters as $filterKey => $filterConfig) { $condition = isset($filterConfig['condition']) ? $conditionMap[$filterConfig['condition']] : FilterComposite::CONDITION_OR; $filterService = $filterConfig['filter']; if (!$serviceLocator->has($filterService)) { throw new ServiceNotCreatedException(sprintf('Invalid filter %s for field %s: service does not exist', $filterService, $name)); } $filterService = $serviceLocator->get($filterService); if (!$filterService instanceof FilterInterface) { throw new InvalidCallbackException(sprintf('Filter service %s must implement FilterInterface'), get_class($filterService)); } $propertyFilter->addFilter($filterKey, $filterService, $condition); } $filterCollection->addFilter($property, $propertyFilter, FilterComposite::CONDITION_AND); } return $filterCollection; }
/** * Remove a filter from the composition. * To not extract "has" methods, you simply need to unregister it * * <code> * $filterComposite->removeFilter('has'); * </code> * * @param $name * @return Filter\FilterComposite */ public function removeFilter($name) { return $this->filterComposite->removeFilter($name); }
public function testWithComplexCompositeAdded() { $filter1 = new FilterComposite(); $filter1->addFilter("foobarbaz", function($property) { return true; }); $filter1->addFilter("foobar", function($property) { return false; }); $filter2 = new FilterComposite(); $filter2->addFilter("bar", function($property) { return true; }, FilterComposite::CONDITION_AND); $filter2->addFilter("barblubb", function($property) { return true; }, FilterComposite::CONDITION_AND); $this->assertTrue($filter1->filter("foo")); $this->assertTrue($filter2->filter("foo")); $filter1->addFilter("bar", $filter2); $this->assertTrue($filter1->filter("blubb")); $filter1->addFilter("blubb", function($property) { return false; }, FilterComposite::CONDITION_AND); $this->assertFalse($filter1->filter("test")); }