zf2: как добавить сервис в валидатор пользовательских форм из слушателя

Я пытаюсь применить пользовательский валидатор, когда новый пользователь (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')
)
),
),
));
}

}

1

Решение

Я прекратил попытки вызывать фабрику валидаторов из слушателя на фильтре. Я скопировал 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;
},

)),
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]