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

1

Я пытаюсь применить специальный валидатор, когда новый пользователь (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-> служба равна нулю, а во время я не вижу, что она вызывает Factory-код. Но валидатор создается каким-то образом.

Неустранимая ошибка: вызов функции-члена greet() для не-объекта в C:\dev\projects\OnlineFieldEvaluation\module\OnlineFieldEvaluation\src\OFEZfcUser\Validators\OFEtoSFEmailValidator.php в строке 50

Изображение 174551

EDIT 2

Я также попытался использовать validator\Callable, чтобы вызвать фабрику валидатора, чтобы он мог внедрить службу в экземпляр проверки. Но фабрика так и не была найдена.

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')
                    )
                ),
            ),
        ));
    }

} 
  • 0
    Вы вызываете if (!$this->validateSFEmail()) в своем методе isValid() но вы, похоже, не объявили этот метод. Может быть, вы хотели вызвать метод обслуживания? if (!$this->service->validateSFEmail())
  • 0
    @ Четко, прости. Я случайно удалил часть кода. Я добавил это сейчас, а также добавил вывод ошибок и дополнительные пояснения. Благодарю.
Теги:
zend-framework2
zend-validate
zfcuser

1 ответ

0

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

        )),

Ещё вопросы

Сообщество Overcoder
Наверх
Меню