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

时间:2015-05-15 13:08:03

标签: php forms validation zend-framework

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

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

    现在我要写zend custom validator。这将完成所有这一过程。

    这是我的自定义验证器:

    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()函数,而不是在表单提交后调用。因此,我正在检查方法是否不发布,为此我使用前端控制器在表单验证器中有请求对象。

    $request = Zend_Controller_Front::getInstance()->getRequest();
    
    if (!$request->isPost()) {
        $csrfValidator = new Website_Service_CsrfValidator();
        $csrfValidator->setToken();
    }
    

    我不确定这是否合法。如果没有,请建议我以另一种方式实现上述情况。

    提前致谢

1 个答案:

答案 0 :(得分:0)

你可以试试这个(注意:将'发送'改为你的提交按钮的id属性值):

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

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