我必须在数据库中插入一些数据后显示消息。我正在使用Kohana。有没有办法用flash消息来做到这一点?它比标题刷新更好。
答案 0 :(得分:2)
好吧。您可以使用Session::get_once()
功能。但这只允许您检索一次变量,并且不能在同一请求中再次使用它。虽然您希望Flash消息持续完整的请求周期。要管理你需要一个包装类,就像这样。
class Flash {
private $session;
private $messages = array();
private static $_instance; // Singleton object
public static function instance() {
if ( ! isset( self::$_instance ) ) {
self::$_instance = new Flash();
}
return self::$_instance;
}
private function __construct() {
$this->session = Session::instance();
$this->messages['current'] = $this->session->get_once('flash');
if( ! is_array($this->messages['current'] ) ) {
$this->messages['current'] = array();
}
}
public function add( $key, $message === null ) {
if ( is_null( $message ) ) {
$message = $key;
$key = null;
}
$this->messages['new'][$key] = $message;
$this->session->set('flash', $this->messages['new'] );
return true;
}
public function get( $item = null ) {
if( $item === null ) {
return $this->messages['current'];
}
if( ! array_key_exists($item, $this->messages['current']) ) {
return null;
}
return $this->messages['current'][$item];
}
}
用法:
$flash = Flash::instance(); $flash->add('A random message'); $flash->add('some_key', 'Some message'); $flash->get(); // array( 0 => 'A random message', 'some_key' => 'Some message') $flash->get('some_key'); // 'A Random message'
它的作用基本上是在初始化时,它使用get_once()
函数从会话中检索当前消息。该变量不是Session对象,因此它只会持续此请求。每次添加变量时,它都会立即保存到Session对象。
只有一个问题;如果您正在使用ajax调用,则消息将仅在初始php请求中可用,而不是在后续的ajax调用上。对于您要存储的变量类型也没有任何限制(但must be serializable)。你也必须为此建立一些检查。
警告:该类未经过测试,因此如果您没有收到语法错误,我会感到惊讶;)
更进一步:无论如何你还需要额外的刷新。请求流应该像这样imo:
请求1:用户是表格 请求2:用户发布已处理的表单。数据插入数据库中。完成后,将重定向用户 请求3:显示确认页面(可以是"谢谢你"或详细页面,无论如何)。
您可以在请求2中设置Flash消息,并在3中显示。我不会直接在请求2上显示感谢页面,因为当用户刷新时,表单将再次发布。
答案 1 :(得分:0)