在Symfony2 / MVC中实现返回响应的方法的最佳位置

时间:2016-02-07 11:57:18

标签: symfony oop model-view-controller

由于Symfony2框架的StreamedResponse对象,我得到了一种能够创建CSV文件的方法。我多次使用该方法,所以我放了一个回调参数来个性化行为(我忘记了面向对象编程中这种做法的流行语)。

将此方法放在MVC项目中的最佳位置在哪里?

  • 存储库? (型号/ DAO /经理)
  • 实体? (POPO)
  • 控制器
  • 服务
  • 通过界面(此对象能够创建CSV文件)
  • 其他

1 个答案:

答案 0 :(得分:3)

当您的逻辑返回响应时,最适应的上下文是控制器。

此外,如果您的逻辑是从多个上下文或同一个上下文的多个类(例如控制器)调用的,为避免重复代码,您有两种可能性(至少):

1 - 使用AbstractController并使控制器扩展为摘要。

2-使用服务(即CsvManager)。

如果您想要一些示例实现,请参阅Symfony文档的Symfony2 reusable functions in controllersController 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 */);
    }
}