ZF2, ZF2-NoCaptcha, FormValidation


ZF2, ZF2-NoCaptcha, FormValidation

我使用szmnmichalowski/ZF2 NoCaptcha进行captcha验证,我有以下设置。我如何使用相同的验证器来验证"captcha"表单元素以及生成并嵌入到表单中的"g-repatcha-response"?即使我键入了正确的captcha,我也会收到"两个给定的令牌不匹配"的错误消息。但我可以使用自定义验证器进行验证。

composer.json

{
    "require": {
        "php": ">=5.3.3",
        "zendframework/zendframework": "2.3.3",
        "spoonx/sxmail": "1.4.*",
        "slm/queue": "0.4.*",
        "szmnmichalowski/zf2-nocaptcha": "dev-master"
    }
}

config/application.config.php

return array(
    'modules' => array(
        'SxMail',
        'SlmQueue',
        'Application',
        'NoCaptcha'
    )
);

module/Application/module.php

<?php
namespace Application;
class Module implements AutoloaderProviderInterface, ConfigProviderInterface, BootstrapListenerInterface
{
    public function getFormElementConfig()
    {
        return array(
            'factories' => array(
                'Application'Form'ContactusForm' => function ($serviceManager) {
                    $form = new 'Application'Form'ContactusForm();
                    return $form;
                }
            )
        );
    }
}

module/Application/src/Application/Form/ContactusForm.php

<?php
namespace Application'Form;
use Zend'Form'Element;
use Zend'Form'Form;
use Zend'ServiceManager'ServiceLocatorAwareInterface;
use Zend'InputFilter'InputFilterAwareInterface;
use Zend'InputFilter'InputFilter;
use Zend'InputFilter'Factory as InputFactory;

class ContactusForm extends Form implements InputFilterAwareInterface, ServiceLocatorAwareInterface
{
    protected $inputFilter;
    public function __construct($name = null)
    {
        parent::__construct('ContactUs');
    }
    public function init()
    {
        $name = new 'Zend'Form'Element'Text('name');
        $name->setAttributes(array(
                'class'       => 'form-control',
                'id'          => 'name',
                'placeholder' => 'Name',
                'required'    => 'Name required'
            )
        );
        $this->add($name);
        $config = $this->getServiceLocator()->getServiceLocator()->get('config');
        $options = $config['application']['captcha'];
        $captcha = new 'NoCaptcha'Captcha'ReCaptcha($options);
        $this->add(array(
            'type'  => 'Zend'Form'Element'Captcha',
            'name'  => 'captcha',
            'attributes' => array(
                'id'     => 'recaptcha-response',
            ),
            'options' => array(
                'label'   => 'Are you a bot?',
                'captcha' => $captcha
            )
        ));
    }
    public function getInputFilter()
    {
        if (!$this->inputFilter) {
            $inputFilter = new InputFilter();
            $factory = new InputFactory();
            $inputFilter->add($factory->createInput([
                'name' => 'name',
                'required' => true,
                'filters' => array(
                    array(
                        'name' => 'StripTags'
                    ),
                    array(
                        'name' => 'StringTrim'
                    )
                ),
                'validators' => array(
                    array(
                        'name' => 'not_empty',
                        "options" => array(
                            "messages" => array(
                                "isEmpty" => "Name is empty."
                            ),
                        ),
                    ),
                )
            ]));
            $inputFilter->add($factory->createInput([
                'name' => 'captcha',
                'required' => true,
                'validators' => array(
                    array(
                        'name'    => 'Identical',
                        'options' => array(
                            'token' => 'g-recaptcha-response',
                        )
                    )
                )
            ]));
            $this->inputFilter = $inputFilter;
        }
        return $this->inputFilter;
    }
}

module/Application/src/Application/Controller/IndexController.php

<?php
namespace Application'Controller;
use Application'Form'ContactusForm;
class IndexController extends ApplicationController
{
    public function __construct(
        'Application'Service'EmailService $emailService
    ) {
        $this->emailService = $emailService;
    }
    public function indexAction()
    {
        $contactUsForm = $this->getServiceLocator()->get('FormElementManager')->get('Application'Form'ContactusForm');
        $contactUsForm->setTranslator($this->translator);
        $request = $this->getRequest();
        if ($request->isPost()) {
            $postData = $request->getPost();
            $contactUsForm->setData($postData);
            if ($contactUsForm->isValid()) {
                $emailJob = $this->getJobManager()->get('Application'Job'Email');
                $emailJob->setContent(
                //content
                );
                $this->getDoctrineQueue()->push($emailJob);
                $successMessage = $this->translator->translate('Message successfully sent.');
                $this->flashMessenger()->addSuccessMessage($successMessage);
                $this->redirect()->toRoute('home');
            } else {
                $errorMessage = $this->translator->translate('Message failed. Please try again');
                $this->flashMessenger()->addErrorMessage($errorMessage);
            }
        }
        $viewModel = new ViewModel();
        $viewModel->setVariable('form', $contactUsForm);
        return $viewModel;
    }
}

看起来工作量很大。请尝试以下操作:https://github.com/Saeven/zf2-circlical-recaptcha

披露:我是作者,但至少可以保证它有效。

您可以查看我的免费ZF2模块mxreCaptcha,它是:

  1. 更易于使用
  2. 具有更好的单元测试覆盖率
  3. 在CI/CD下
  4. 成熟且有版本
  5. 遵循SemVer
  6. 广泛用于我公司的商业项目