使用ColdBox Framework,如何在模型内部使用BuildLink()?

时间:2019-02-11 19:57:09

标签: coldfusion cfml coldbox

我有一个CFML ColdBox框架模型服务,需要建立链接。但是,模型无权访问SuperType框架,因此无权访问event.buildLink()

如何为模型中的服务提供创建链接的能力?是否可以通过某种依赖注入使buildLink()功能可用?

样本模型服务:

component 
    singleton
{

    function getLinkToUser( required numeric userId ) {

        return event.buildLink( "users.#arguments.usersId#" );

    }

}

-更新-

许多评论建议将框架功能嵌入模型可能是一个错误,buildLink()实际上仅应在视图内使用。在很大程度上,我同意,并且觉得将框架服务引入模型会违反封装和关注点。

话虽这么说,让我们将上面的代码示例扩展到更现实的情况: 假设您有一个模型服务,可以为客户生成电子邮件,而这些电子邮件的内容很大程度上取决于复杂的业务规则。在这种情况下,我可以看到用于在模型中生成电子邮件内容的参数,因为这是业务规则所在的地方。

如果改为在视图中生成电子邮件内容,则将业务逻辑执行到实际上只应用于显示/输出的层中。

假设在模型层中生成电子邮件正文是正确的事情,那么它也应该能够基于这些电子邮件中的框架路由来构建HTML链接是否也有意义?

1 个答案:

答案 0 :(得分:1)

我建议使用CBMailService之类的东西,然后在发送邮件中呈现布局/视图,在其中,您可以访问事件以构建链接。

您可以将变量的bodyTokens传递到视图中,它将为您处理呈现。

希望这会有所帮助。

var mail = mailservice.newMail(
        to          = arguments.recipients,
        from        = '"Do not reply" <postmaster@noreply>',
        subject     = arguments.emailSubject,
        bodyTokens  = bodyTokens,
        type        = 'html',
        additionalInfo  = { categories: categories }
    );
    mail.setBody(
        renderer.get()
            .renderLayout(
                view    = "/modules/core/views/email/emailSigninSheet",
                layout  = "/modules/core/layouts/email"

            )
    );