Я пытаюсь применить пользовательский валидатор, когда новый пользователь (ZfcUser) регистрируется в системе. Валидатор должен использовать сервис. Я пытаюсь внедрить сервис через фабрику, но похоже, что код на фабрике никогда не получает возможности запустить и внедрить сервис.
Вот мой код:
<?php
/**
* OnlineFieldEvaluation - RegisterFilterListener.php
*
* Initial version by: vraskin
* Initial version created on: 9/3/15
*/
namespace OFEZfcUser\Listener;
use Zend\EventManager\AbstractListenerAggregate;
use Zend\EventManager\EventManagerInterface;
use Zend\EventManager\Event;
class RegisterFilterListener extends AbstractListenerAggregate {
public function attach(EventManagerInterface $events)
{
$sharedManager = $events->getSharedManager();
$this->listeners[] = $sharedManager->attach('ZfcUser\Form\RegisterFilter', 'init', array($this, 'onInit'));
}
public function onInit(Event $e)
{
$filter = $e->getTarget();
$filter->add(array(
'name' => 'email',
'required' => true,
'validators' => array(
array(
'name' => 'OFEZfcUser\Validators\OFEtoSFEmailValidator',
'options' => null,
),
),
));
}
}
module.php
public function getValidatorConfig() {
return array(
// 'invokables' => array(
// 'OFEZfcUser\Validators\OFEtoSFEmailValidator' => 'OFEZfcUser\Validators\OFEtoSFEmailValidator'
// ),
'factories' => array(
// 'OFEZfcUser\Validators\OFEtoSFEmailValidator' => 'OFEZfcUser\Factories\OFEValidatorFactory',
'OFEZfcUser\Validators\OFEtoSFEmailValidator' => function ($serviceManager) {
$ofeService = $serviceManager->getServiceLocator()->get('OFEClientForRestSalesforceAPIService');
$ofeValidator = new \OFEZfcUser\Validators\OFEtoSFEmailValidator();
$ofeValidator->setOFEService($ofeService);
return $ofeValidator;
}
)
);
}
Validator
<?php
namespace OFEZfcUser\Validators;
use Zend\Validator\AbstractValidator;
class OFEtoSFEmailValidator extends AbstractValidator{
const NOTSFEMAIL = 'NOTSFEMAIL';
protected $messageTemplates = array(
self::NOTSFEMAIL => 'This user is not registered in our system. Please, contact a field administration',
);
protected $service;
public function __construct(array $options = array()){
parent::__construct($options);
}
public function isValid($value,$context = null){
$this->setValue($value);
if (!$this->validateSFEmail($value, $context['userRole'])) {
$this->error(self::NOTURL);
return false;
}
return true;
}
private function validateSFEmail($email, $userRole) {
echo $this->service->greet();
$sfRes = $this->service->isStudentExist($email, $userRole);
var_dump( $sfRes );
if ($sfRes != true && $sfRes != false ) {
return false;
} else {
return $sfRes;
}
}
public function setOFEService($service)
{
$this->service = $service;
}
}
И это ошибка, которую я получаю: $ this-> service равен null, и во время, когда я не вижу, он вызывает Factory code. Но валидатор как-то создан.
Неустранимая ошибка: вызов функции-члена greet () для необъекта в C: \ dev \ projects \ OnlineFieldEvaluation \ module \ OnlineFieldEvaluation \ src \ OFEZfcUser \ Validators \ OFEtoSFEmailValidator.php в строке 50
РЕДАКТИРОВАТЬ 2
Я также пытался использовать validator \ Callable для вызова фабрики validator, чтобы он мог внедрить службу в экземпляр validator. Но так и не нашли фабрику.
module.php
public function getValidatorConfig()
{
return [
'factories' => [
'OFEtoSFEmailValidator' => function ($serviceManager) {
$ofeService = $serviceManager->getServiceLocator()->get('OFEClientForRestSalesforceAPIService');
$ofeValidator = new \OFEZfcUser\Validators\OFEtoSFEmailValidator(['service' => $ofeService]);
return $ofeValidator;
}
]
];
}
И тогда я пытаюсь создать экземпляр из RegisterFileterListener с помощью Validator \ Callable
namespace OFEZfcUser\Listener;
use Zend\EventManager\AbstractListenerAggregate;
use Zend\EventManager\EventManagerInterface;
use Zend\EventManager\Event;
class RegisterFilterListener extends AbstractListenerAggregate
{
public function attach(EventManagerInterface $events)
{
$sharedManager = $events->getSharedManager();
$this->listeners[] = $sharedManager->attach('ZfcUser\Form\RegisterFilter', 'init', array($this, 'onInit'));
}
public function onInit(Event $e)
{
$filter = $e->getTarget();
$valid = new \Zend\Validator\Callback('OFEtoSFEmailValidator');
$validators = $filter->get('email')->getValidatorChain();
$factory = new \OFEZfcUser\Factories\OFEValidatorFactory();
$filter->add(array(
'name' => 'email',
'required' => true,
'validators' => array(
array(
'name' => 'Callback',
'options' => array(
'messages' => array(
\Zend\Validator\Callback::INVALID_VALUE => 'My custom message',
\Zend\Validator\Callback::INVALID_CALLBACK => 'My custom message'
),
'callback' => array($factory, 'createService')
)
),
),
));
}
}
Я прекратил попытки вызывать фабрику валидаторов из слушателя на фильтре. Я скопировал RegisterFilter из ZfcUser и изменил его конструктор для принятия третьего валидатора. Затем я вызвал фабрику валидаторов из файла module.config.php и вставил ее в свой пользовательский фильтр.
'service_manager' => array(
'factories' => array(
'zfcuser_register_form' => function ($sm) {
$options = $sm->get('zfcuser_module_options');
$validators = $sm->get('ValidatorManager');
$ofeVal = $validators->get('MyOFEtoSFEmailValidator');
$registerFilter = new ZfcUserRegisterFilterExtension(
new Validator\NoRecordExists(array(
'mapper' => $sm->get('zfcuser_user_mapper'),
'key' => 'email'
)),
new Validator\NoRecordExists(array(
'mapper' => $sm->get('zfcuser_user_mapper'),
'key' => 'username'
)),
// My custom Validator to connect to SF and validate email
$ofeVal,
$options
);
$form = new \OFEZfcUser\Form\ZfcUserRegisterExtension(null, $options);
$form->setInputFilter($registerFilter);
return $form;
},
)),
Других решений пока нет …