2010-06-29 37 views
0

是否可以捕获任务中操作的输出?Symfony任务:获取模块/操作的输出

例:

FooAction 
{ 
    executeIndexSuccess() 
} 

,并在我的任务:

FooAction->指数

这可能吗?

+0

这是可能的,但如果在很多情况下使用这个代码,你最好把它放在模型中。 – 2010-06-30 12:50:31

回答

3

是的。在你的任务的​​方法:

sfContext::createInstance($this->configuration); 
$output = sfContext::getInstance()->getController()->getPresentationFor("module", "action"); 

从动作和关联的视图上得到的输出将存储在$output

如果你的动作需要的变量设置到会话中,你也可以做这样的事情:

sfContext::getInstance()->getUser()->setAttribute("mySessionVar", 123); 
sfContext::getInstance()->getUser()->setFlash("myFlashVar", "foo"); 

你打电话getPresentationFor(),使变量都存在在执行行动之前。

2

你不应该在一项任务中做到这一点!控制器操作不是为此目的而构建的。只需重构你的控制器。将你需要与任务共享的代码解压到一个单独的类中,并在你的操作和任务中使用这个类。请记住,sfContext不是可靠的信息来源。这个对象的内容取决于你的应用程序是如何启动的(Commandline!= HTTP)

+0

sfContext不可靠或不理想,你是对的。不过,我认为在任务中获取控制器输出的应用程序很多 - 使用标准布局装饰器的自动化HTML电子邮件是一个令人想到的例子。你可以使用提供的MVC风格结构:-) – richsage 2010-06-30 17:54:09

+0

这正是我期望做的事情:我想设置一个任务,根据数据库中的内容发送电子邮件,这是运行在一个cron脚本中。基本上这是以异步的方式完成的。 所以现在,当你说“使用MVC风格的结构时,你指的是什么?” – Paul 2010-06-30 20:43:08

+0

对于HTML-Emails,你需要一些Symfony的视图部分和一个sfContext,但即使你想发送一个电子邮件我希望在任务中使用动作方法呈现部分内容,所以你不会依赖请求/响应处理,并可以使用模板来生成电子邮件 – Timo 2010-07-01 06:15:50