我有一个CFML ColdBox框架模型服务,需要建立链接。但是,模型无权访问SuperType框架,因此无权访问event.buildLink()
。
如何为模型中的服务提供创建链接的能力?是否可以通过某种依赖注入使buildLink()
功能可用?
样本模型服务:
component
singleton
{
function getLinkToUser( required numeric userId ) {
return event.buildLink( "users.#arguments.usersId#" );
}
}
-更新-
许多评论建议将框架功能嵌入模型可能是一个错误,buildLink()
实际上仅应在视图内使用。在很大程度上,我同意,并且觉得将框架服务引入模型会违反封装和关注点。
话虽这么说,让我们将上面的代码示例扩展到更现实的情况: 假设您有一个模型服务,可以为客户生成电子邮件,而这些电子邮件的内容很大程度上取决于复杂的业务规则。在这种情况下,我可以看到用于在模型中生成电子邮件内容的参数,因为这是业务规则所在的地方。
如果改为在视图中生成电子邮件内容,则将业务逻辑执行到实际上只应用于显示/输出的层中。
假设在模型层中生成电子邮件正文是正确的事情,那么它也应该能够基于这些电子邮件中的框架路由来构建HTML链接是否也有意义?
答案 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"
)
);