将持久闪存消息库用于ColdFusion

将持久闪存消息库用于ColdFusion,coldfusion,coldfusion-9,railo,lucee,Coldfusion,Coldfusion 9,Railo,Lucee,我试图使用一个库来显示Flash消息,但我无法使它正常工作。文档不是很好,我对ColdFusion是新手。我希望能够跨页面显示持久的错误消息。特别是在签出期间,因此当用户需要返回或出现验证错误时,将显示消息。根据文件: FlashMessage.cfc需要三个参数才能工作: 对闪存存储对象的引用。该对象将需要 get(key)和put(key,value)方法。具有 以下属性:避免命名的唯一flashKey名称 冲突。对containerTemplatePath的引用。这就是观点 它围绕着每个单

我试图使用一个库来显示
Flash消息
,但我无法使它正常工作。文档不是很好,我对ColdFusion是新手。我希望能够跨页面显示持久的错误消息。特别是在签出期间,因此当用户需要返回或出现验证错误时,将显示消息。根据文件:

FlashMessage.cfc需要三个参数才能工作:

对闪存存储对象的引用。该对象将需要 get(key)和put(key,value)方法。具有 以下属性:避免命名的唯一flashKey名称 冲突。对containerTemplatePath的引用。这就是观点 它围绕着每个单独的消息。它会有 对flashMessages数组和messageTemplatePath的引用。A. 对messageTemplatePath的引用。这就是 表示FlashMessage中的单个消息。它将有一个参考 到一个单一的闪光信息。名称由您在容器中选择 模板。使用两个参数创建对象,然后使用它 像平常一样

我发现了错误

the function getMessages has an invalid return value , can't cast null value to value of type [array]
我曾经让这个脚本在某种程度上起作用,但它似乎非常挑剔。我相信这是我的实践。我希望这里有人能帮我找出哪里出了错。或者给我一些建议,因为我甚至不确定我是否正确地实现了它

这是我在测试脚本中的内容:

<cfscript>

    alertStorage = createObject("component", 'alert');

    config = {
        flashKey = "myCustomFlashKey",
        containerTemplatePath = "/flashmessage/views/_templates/FlashMessageContainer.cfm",
        messageTemplatePath = "/flashmessage/views/_templates/FlashMessage.cfm"    
    };

    flash = new flashmessage.models.FlashMessage(alertStorage, config);
    flash.message('blah');
    flash.danger('boom');


</cfscript>

这比我想应付的代码还要多。但是,错误消息会告诉您出了什么问题。隔离适用的函数并找出获得空值的原因。然后决定该怎么做。这比我愿意应付的代码还要多。但是,错误消息会告诉您出了什么问题。隔离适用的函数并找出获得空值的原因。然后决定怎么做。
component {

    public any function get(key) {
        for(var i = 1; i < ArrayLen(session[key]); i++) {
            return session[key][i];
        }
    }

    public any function put(key, value) {
        ArrayAppend(session.myCustomFlashKey, value);
        return true;
    }

    public any function exists() {
        if(structKeyExists(session,"myCustomFlashKey")) {
            return true;
        } else {
            session.myCustomFlashKey = ArrayNew();
            return false;
        }
    }
}
component name="FlashMessage" singleton {

    /**
     * @flashStorage.inject coldbox:flash
     * @config.inject coldbox:setting:flashmessage
     */
    public FlashMessage function init(any flashStorage, any config) {
        instance.flashKey = arguments.config.flashKey;

        singleton.flashStorage = arguments.flashStorage;
        instance.containerTemplatePath = arguments.config.containerTemplatePath;
        instance.messageTemplatePath = arguments.config.messageTemplatePath;

        // Initialize our flash messages to an empty array if it hasn't ever been created
        if (! singleton.flashStorage.exists(instance.flashKey)) {
            setMessages([]);
        }

        return this;
    }


    public void function message(required string text, string type = "default") {
        appendMessage({ message: arguments.text, type = arguments.type });
    }

    public any function onMissingMethod(required string methodName, required struct methodArgs) {
        message(methodArgs[1], methodName);
    }

    public any function render() {
        var flashMessages = getMessages();
        var flashMessageTemplatePath = instance.messageTemplatePath;
        savecontent variable="messagesHTML" {
            include "#instance.containerTemplatePath#";
        }

        setMessages([]);

        return messagesHTML;
    }

    public array function getMessages() {
        return singleton.flashStorage.get(instance.flashKey, []);
    }

    private void function setMessages(required array messages) {
        singleton.flashStorage.put(
            name  = instance.flashKey,
            value = arguments.messages
        );
    }

    private void function appendMessage(required struct message) {
        var currentMessages = getMessages();
        ArrayAppend(currentMessages, arguments.message);
        setMessages(currentMessages);
    }



}