如何在Kohana 3中显示flash消息

时间:2015-11-30 20:12:45

标签: kohana flash-message

我必须在数据库中插入一些数据后显示消息。我正在使用Kohana。有没有办法用flash消息来做到这一点?它比标题刷新更好。

2 个答案:

答案 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)