由于Symfony2框架的StreamedResponse对象,我得到了一种能够创建CSV文件的方法。我多次使用该方法,所以我放了一个回调参数来个性化行为(我忘记了面向对象编程中这种做法的流行语)。
将此方法放在MVC项目中的最佳位置在哪里?
答案 0 :(得分:3)
当您的逻辑返回响应时,最适应的上下文是控制器。
此外,如果您的逻辑是从多个上下文或同一个上下文的多个类(例如控制器)调用的,为避免重复代码,您有两种可能性(至少):
1 - 使用AbstractController并使控制器扩展为摘要。
2-使用服务(即CsvManager)。
如果您想要一些示例实现,请参阅Symfony文档的Symfony2 reusable functions in controllers和Controller as a service章节。
服务实施的一个例子:
// src/AppBundle/Services/CsvManager.php
class CsvManager
{
public function generate(/** params */)
{
// Return your streamed response
}
}
服务声明:
// app/config/services.yml
services:
# ...
app.csv_manager:
class: AppBundle\Services\CsvManager
现在,您可以使用来自所有控制器和实现服务容器的其他上下文的服务。例如:
// src/AppBundle/Controller/TestController.php;
class TestController extends \Symfony\Bundle\FrameworkBundle\Controller\Controller
{
public function printCsvAction()
{
$csvManager = $this->get('app.csv_manager');
return $csvManager->generate(/** params */);
}
}