(с использованием Zend Framework 2.2.4)
Моя фабрика валидатора, похоже, не существует во время проверки. Если я попытаюсь создать экземпляр валидатора с контроллера, в котором размещена форма, он, наоборот, отлично работает:
Это работает…
$mycustomvalidator = $this->getServiceLocator() ->get('ValidatorManager') ->get('LDP_PinAvailable');
Вот как это делается в коде в противном случае, я не могу найти проблему, и я надеялся избежать открытия источника ZF2 для понимания. По документам это кажется правильным.
Конфигурация модуля
public function getValidatorConfig() { return array( 'abstract_factories' => array( '\LDP\Form\Validator\ValidatorAbstractFactory', ), ); }
Фабричный класс
namespace LDP\Form\Validator; use Zend\ServiceManager\AbstractFactoryInterface, Zend\ServiceManager\ServiceLocatorInterface; class ValidatorAbstractFactory implements AbstractFactoryInterface { public function canCreateServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName) { return stristr($requestedName, 'LDP_PinAvailable') !== false; } public function createServiceWithName(ServiceLocatorInterface $locator, $name, $requestedName) { // baked in for sake of conversation $validator = new \LDP\Form\Validator\PinAvailable(); if( $validator instanceof DatabaseFormValidatorInterface ) $validator->setDatabase( $locator->get('mysql_slave') ); return $validator; } }
Пользовательский валидатор
namespace LDP\Form\Validator; class PinAvailable extends \Zend\Validator\AbstractValidator implements DatabaseFormValidatorInterface { /** * @var \Zend\Db\Sql\Sql */ private $database; public function setDatabase( \Zend\Db\Sql\Sql $db ) { $this->database = $db; } public function isValid( $value ) { $DBA = $this->database->getAdapter(); // do the mixed database stuff here return true; } }
Наконец, часть конфигурации валидатора поля формы массива:
'pin' => array( 'required' => true, 'filters' => array( array('name' => 'alnum'), array('name' => 'stringtrim'), ), 'validators' => array( array( 'name' => 'LDP_PinAvailable' ) ), ), ),
Собирая все это вместе, загружает форму, а когда отправляется, это происходит со следующей трассировкой стека:
2013-10-28T17:09:35-04:00 ERR (3): Exception: 1: Zend\Validator\ValidatorPluginManager::get was unable to fetch or create an instance for LDP_PinAvailable Trace: #0 /Users/Saeven/Documents/workspace/Application/vendor/zendframework/zendframework/library/Zend/ServiceManager/AbstractPluginManager.php(103): Zend\ServiceManager\ServiceManager->get('LDP_PinAvailabl...', true) #1 /Users/Saeven/Documents/workspace/Application/vendor/zendframework/zendframework/library/Zend/Validator/ValidatorChain.php(82): Zend\ServiceManager\AbstractPluginManager->get('LDP_PinAvailabl...', Array)