Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在zend(1.12)自定义验证器中访问请求obejct合法吗?_Php_Forms_Validation_Zend Framework - Fatal编程技术网

Php 在zend(1.12)自定义验证器中访问请求obejct合法吗?

Php 在zend(1.12)自定义验证器中访问请求obejct合法吗?,php,forms,validation,zend-framework,Php,Forms,Validation,Zend Framework,我使用的是zend framework 1.12。我有一个验证令牌的服务。具有两种功能的服务 setToken:负责在会话中生成令牌和存储 validateToken:负责重新生成令牌,并使用会话中存储的令牌对其进行验证 当前情况是,我在加载表单时调用setToken()函数,并且validateToken()函数将在表单提交后被调用 现在我想写zend自定义验证器。这将完成整个过程 这是我的自定义验证器: class My_Validator_Csrf extends Zend_Validat

我使用的是
zend framework 1.12
。我有一个验证令牌的服务。具有两种功能的服务

  • setToken
    :负责在会话中生成令牌和存储
  • validateToken
    :负责重新生成令牌,并使用会话中存储的令牌对其进行验证
  • 当前情况是,我在加载表单时调用
    setToken()
    函数,并且
    validateToken()
    函数将在表单提交后被调用

    现在我想写
    zend自定义验证器
    。这将完成整个过程

    这是我的自定义验证器:

    class My_Validator_Csrf extends Zend_Validate_Abstract
    {
        const INVALID_TOKEN = 'invalid_token';
    
        /**
         * Message templates
         * @var array
         */
        protected $_messageTemplates = array(
            self::INVALID_TOKEN => "csrf_form_error", 
        );
    
        /**
         * Generates and set token in session.
         */
        public function __construct()
        {
            $request = Zend_Controller_Front::getInstance()->getRequest();
    
            if (!$request->isPost()) {
                $csrfValidator = new Website_Service_CsrfValidator();
                $csrfValidator->setToken();
            }
        }
    
        /**
         * Validates csrf token.
         * 
         * @return boolean
         */
        public function isValid($value) 
        {
            $csrfValidator = new Website_Service_CsrfValidator();
    
            if (!$csrfValidator->validateToken()) {
                $this->_error(self::INVALID_TOKEN);
                return false;
            }
    
            return false;
        }
    }
    
    问题
    setToken()
    函数只能在加载表单时调用,而不能在表单提交后调用。所以,我检查方法是否不是post,为此,我使用前端控制器在表单验证器中拥有请求对象

    $request = Zend_Controller_Front::getInstance()->getRequest();
    
    if (!$request->isPost()) {
        $csrfValidator = new Website_Service_CsrfValidator();
        $csrfValidator->setToken();
    }
    
    我不确定这是否合法。如果没有,请建议我实现上述情景的另一种方法

    提前感谢

    您可以尝试此操作(注意:将“发送”更改为提交按钮的id属性值):

    另一种选择是将表单提交发布到不同的url/操作

    if ($request->getParam('send', false)) { // user submitted form
      ...
    } else { // form not yet submitted
      ...
    }