Source of file Factory.php
Size: 13,864 Bytes - Last Modified: 2014-03-12T23:21:18+01:00
/home/theseer/Downloads/ZendFramework-2.3.0/library/Zend/InputFilter/Factory.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401 | <?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\InputFilter; use Traversable; use Zend\Filter\FilterChain; use Zend\Stdlib\ArrayUtils; use Zend\Validator\ValidatorInterface; use Zend\Validator\ValidatorChain; use Zend\ServiceManager\ServiceLocatorInterface; class Factory { /** * @var FilterChain */ protected $defaultFilterChain; /** * @var ValidatorChain */ protected $defaultValidatorChain; /** * @var InputFilterPluginManager */ protected $inputFilterManager; /** * @param InputFilterPluginManager $inputFilterManager */ public function __construct(InputFilterPluginManager $inputFilterManager = null) { if ($inputFilterManager) { $this->setInputFilterManager($inputFilterManager); } $this->defaultFilterChain = new FilterChain(); $this->defaultValidatorChain = new ValidatorChain(); } /** * Set default filter chain to use * * @param FilterChain $filterChain * @return Factory */ public function setDefaultFilterChain(FilterChain $filterChain) { $this->defaultFilterChain = $filterChain; return $this; } /** * Get default filter chain, if any * * @return null|FilterChain */ public function getDefaultFilterChain() { return $this->defaultFilterChain; } /** * Clear the default filter chain (i.e., don't inject one into new inputs) * * @return void */ public function clearDefaultFilterChain() { $this->defaultFilterChain = null; } /** * Set default validator chain to use * * @param ValidatorChain $validatorChain * @return Factory */ public function setDefaultValidatorChain(ValidatorChain $validatorChain) { $this->defaultValidatorChain = $validatorChain; return $this; } /** * Get default validator chain, if any * * @return null|ValidatorChain */ public function getDefaultValidatorChain() { return $this->defaultValidatorChain; } /** * Clear the default validator chain (i.e., don't inject one into new inputs) * * @return void */ public function clearDefaultValidatorChain() { $this->defaultValidatorChain = null; } /** * @param InputFilterPluginManager $inputFilterManager * @return self */ public function setInputFilterManager(InputFilterPluginManager $inputFilterManager) { $this->inputFilterManager = $inputFilterManager; $serviceLocator = $this->inputFilterManager->getServiceLocator(); if ($serviceLocator && $serviceLocator instanceof ServiceLocatorInterface) { if ($serviceLocator->has('ValidatorManager')) { $this->getDefaultValidatorChain()->setPluginManager($serviceLocator->get('ValidatorManager')); } if ($serviceLocator->has('FilterManager')) { $this->getDefaultFilterChain()->setPluginManager($serviceLocator->get('FilterManager')); } } return $this; } /** * @return InputFilterPluginManager */ public function getInputFilterManager() { if (null === $this->inputFilterManager) { $this->inputFilterManager = new InputFilterPluginManager; } return $this->inputFilterManager; } /** * Factory for input objects * * @param array|Traversable $inputSpecification * @throws Exception\InvalidArgumentException * @throws Exception\RuntimeException * @return InputInterface|InputFilterInterface */ public function createInput($inputSpecification) { if (!is_array($inputSpecification) && !$inputSpecification instanceof Traversable) { throw new Exception\InvalidArgumentException(sprintf( '%s expects an array or Traversable; received "%s"', __METHOD__, (is_object($inputSpecification) ? get_class($inputSpecification) : gettype($inputSpecification)) )); } if ($inputSpecification instanceof Traversable) { $inputSpecification = ArrayUtils::iteratorToArray($inputSpecification); } $class = 'Zend\InputFilter\Input'; if (isset($inputSpecification['type'])) { $class = $inputSpecification['type']; if ($this->getInputFilterManager()->has($class)) { return $this->createInputFilter($inputSpecification); } if (!class_exists($class)) { throw new Exception\RuntimeException(sprintf( 'Input factory expects the "type" to be a valid class; received "%s"', $class )); } } $input = new $class(); if ($input instanceof InputFilterInterface) { return $this->createInputFilter($inputSpecification); } if (!$input instanceof InputInterface) { throw new Exception\RuntimeException(sprintf( 'Input factory expects the "type" to be a class implementing %s; received "%s"', 'Zend\InputFilter\InputInterface', $class )); } if ($this->defaultFilterChain) { $input->setFilterChain(clone $this->defaultFilterChain); } if ($this->defaultValidatorChain) { $input->setValidatorChain(clone $this->defaultValidatorChain); } foreach ($inputSpecification as $key => $value) { switch ($key) { case 'name': $input->setName($value); break; case 'required': $input->setRequired($value); if (isset($inputSpecification['allow_empty'])) { $input->setAllowEmpty($inputSpecification['allow_empty']); } break; case 'allow_empty': $input->setAllowEmpty($value); if (!isset($inputSpecification['required'])) { $input->setRequired(!$value); } break; case 'continue_if_empty': $input->setContinueIfEmpty($inputSpecification['continue_if_empty']); break; case 'error_message': $input->setErrorMessage($value); break; case 'fallback_value': $input->setFallbackValue($value); break; case 'break_on_failure': $input->setBreakOnFailure($value); break; case 'filters': if ($value instanceof FilterChain) { $input->setFilterChain($value); break; } if (!is_array($value) && !$value instanceof Traversable) { throw new Exception\RuntimeException(sprintf( '%s expects the value associated with "filters" to be an array/Traversable of filters or filter specifications, or a FilterChain; received "%s"', __METHOD__, (is_object($value) ? get_class($value) : gettype($value)) )); } $this->populateFilters($input->getFilterChain(), $value); break; case 'validators': if ($value instanceof ValidatorChain) { $input->setValidatorChain($value); break; } if (!is_array($value) && !$value instanceof Traversable) { throw new Exception\RuntimeException(sprintf( '%s expects the value associated with "validators" to be an array/Traversable of validators or validator specifications, or a ValidatorChain; received "%s"', __METHOD__, (is_object($value) ? get_class($value) : gettype($value)) )); } $this->populateValidators($input->getValidatorChain(), $value); break; default: // ignore unknown keys break; } } return $input; } /** * Factory for input filters * * @param array|Traversable $inputFilterSpecification * @throws Exception\InvalidArgumentException * @throws Exception\RuntimeException * @return InputFilterInterface */ public function createInputFilter($inputFilterSpecification) { if (!is_array($inputFilterSpecification) && !$inputFilterSpecification instanceof Traversable) { throw new Exception\InvalidArgumentException(sprintf( '%s expects an array or Traversable; received "%s"', __METHOD__, (is_object($inputFilterSpecification) ? get_class($inputFilterSpecification) : gettype($inputFilterSpecification)) )); } if ($inputFilterSpecification instanceof Traversable) { $inputFilterSpecification = ArrayUtils::iteratorToArray($inputFilterSpecification); } $type = 'Zend\InputFilter\InputFilter'; if (isset($inputFilterSpecification['type']) && is_string($inputFilterSpecification['type'])) { $type = $inputFilterSpecification['type']; unset($inputFilterSpecification['type']); } $inputFilter = $this->getInputFilterManager()->get($type); if ($inputFilter instanceof CollectionInputFilter) { $inputFilter->setFactory($this); if (isset($inputFilterSpecification['input_filter'])) { $inputFilter->setInputFilter($inputFilterSpecification['input_filter']); } if (isset($inputFilterSpecification['count'])) { $inputFilter->setCount($inputFilterSpecification['count']); } if (isset($inputFilterSpecification['required'])) { $inputFilter->setIsRequired($inputFilterSpecification['required']); } return $inputFilter; } foreach ($inputFilterSpecification as $key => $value) { if (($value instanceof InputInterface) || ($value instanceof InputFilterInterface) ) { $input = $value; } else { $input = $this->createInput($value); } $inputFilter->add($input, $key); } return $inputFilter; } /** * @param FilterChain $chain * @param array|Traversable $filters * @return void */ protected function populateFilters(FilterChain $chain, $filters) { foreach ($filters as $filter) { if (is_object($filter) || is_callable($filter)) { $chain->attach($filter); continue; } if (is_array($filter)) { if (!isset($filter['name'])) { throw new Exception\RuntimeException( 'Invalid filter specification provided; does not include "name" key' ); } $name = $filter['name']; $priority = isset($filter['priority']) ? $filter['priority'] : FilterChain::DEFAULT_PRIORITY; $options = array(); if (isset($filter['options'])) { $options = $filter['options']; } $chain->attachByName($name, $options, $priority); continue; } throw new Exception\RuntimeException( 'Invalid filter specification provided; was neither a filter instance nor an array specification' ); } } /** * @param ValidatorChain $chain * @param array|Traversable $validators * @return void */ protected function populateValidators(ValidatorChain $chain, $validators) { foreach ($validators as $validator) { if ($validator instanceof ValidatorInterface) { $chain->attach($validator); continue; } if (is_array($validator)) { if (!isset($validator['name'])) { throw new Exception\RuntimeException( 'Invalid validator specification provided; does not include "name" key' ); } $name = $validator['name']; $options = array(); if (isset($validator['options'])) { $options = $validator['options']; } $breakChainOnFailure = false; if (isset($validator['break_chain_on_failure'])) { $breakChainOnFailure = $validator['break_chain_on_failure']; } $chain->attachByName($name, $options, $breakChainOnFailure); continue; } throw new Exception\RuntimeException( 'Invalid validator specification provided; was neither a validator instance nor an array specification' ); } } } |