避免Symfony表单的时间过期错误


Avoid time expiration error with Symfony form

评级是一种非常简单、直观的东西,不需要用户多想,尤其是当它被设计成"星星"时(在我的情况下,它是最著名的评级系统,从1到5)。这通常与评级小部件的实现方式形成对比——最流行的解决方案是使用表单或链接。由于几个问题,特别是搜索引擎如何查看页面和链接,强烈不建议使用后者。

因此,我选择了通过表单实现评级小部件:从技术角度来看,它由5个"提交"按钮组成,操作方法只是根据用户点击了哪个(1,2,3,4,5)提交按钮来分配评级。我暂时不使用Ajax。

简单吗?我希望如此。问题的出现是因为PHP-Symfony2(或者一般的网络语言)平台如何处理表单:当表单时间到期时,它将不会被验证!从用户或用户体验的角度来看,这是一件非常非常糟糕的事情——他或她点击并期望评级发生。我在网上没有看到任何网站(例如,一个带有"点赞"按钮的Facebook)显示类似"代币已过期,请重新提交表格"的消息。

在评级等情况下,如何处理表单过期问题,用户应该始终提交这样的表单,尽管验证是一个不应该(?)放弃的过程?或者我应该忽略验证,至少在令牌的情况下是这样吗?

当会话被持久化在缓存中时,我也遇到了类似的问题。每次我更新网站并清除缓存时,会话都会被销毁,令牌也会失效。

既然会话存储在数据库中,我还没有看到这个问题。以下是相关配置:

app/config/config.yml:

framework:
    session:
        # ...
        handler_id: session.handler.pdo
services:
    session.handler.pdo:
        class:     Symfony'Component'HttpFoundation'Session'Storage'Handler'PdoSessionHandler
        public:    false
        arguments:
            - 'mysql:host=%database_host%;port=%database_port%;dbname=%database_name%'
            - { db_username: '%database_user%', db_password: '%database_password%' }

并且必须创建sessions表,以下是如何使用MySQL数据库进行创建:

CREATE TABLE `sessions` (
    `sess_id` VARBINARY(128) NOT NULL PRIMARY KEY,
    `sess_data` BLOB NOT NULL,
    `sess_time` INTEGER UNSIGNED NOT NULL,
    `sess_lifetime` MEDIUMINT NOT NULL
) COLLATE utf8_bin, ENGINE = InnoDB;