【问题标题】:Best place to implement a method that return response in Symfony2/MVC在 Symfony2/MVC 中实现返回响应的方法的最佳位置
【发布时间】:2016-05-17 03:25:03
【问题描述】:

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

将此方法放在 MVC 项目中的最佳位置是什么?

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

【问题讨论】:

  • 如果你需要一些例子,说我。
  • 你明白了 :) 看我的回答

标签: symfony oop model-view-controller


【解决方案1】:

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

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

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 */);
    }
}

【讨论】:

  • +1。根据我的个人经验,我会选择#2 - 您可以创建某种导出服务,通过将您需要的任何数据传递给它来返回您的流式响应并非常容易地重复使用。然后你只需让你的控制器从服务返回响应
  • 绝对是选项 #2!正如@JasonRoman 所提到的,您的代码将是干净且可重用的。 #1st 方法的问题在于,您的抽象控制器将具有其他控制器不需要的逻辑,或者在需要少量抽象控制器的情况下将无法使用。
  • 我同意你的看法。他还可以将服务用作路由的_controller,并直接呈现来自它的响应
  • 太费劲了别担心我用goodby/csv:p。所以基本上要创建一个服务,我需要创建一个实现 CSV 方法的 Bundle 或只是一个控制器,声明服务然后使用它。明白了,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
  • 2011-01-12
  • 1970-01-01
  • 2010-09-07
相关资源
最近更新 更多