2016-02-07 3 views
2

У меня есть способ, который может создать файл CSV благодаря объекту StreamedResponse в структуре Symfony2. Я использую этот метод несколько раз, поэтому я поставил параметр обратного вызова для персонализации поведения (я забыл слово buzz для этой практики в объектно-ориентированном программировании).Лучшее место для реализации метода, возвращающего ответ в Symfony2/MVC

Где лучше всего разместить этот метод в проекте MVC?

  • Репозиторий? (Модель/DAO/Manager)
  • Сущность? (POPO)
  • Контроллера
  • служба
  • Через интерфейс (Этот объект способен создать CSV-файл)
  • Другого
+1

Если вам нужны примеры, скажите мне. – chalasr

+0

@chalasr please: D –

+1

У вас его :) См. Мой ответ – chalasr

ответ

3

Как ваша логика возвращает ответ, наиболее приспособленный контекст является контроллером ,

Кроме того, если ваша логика вызывается из нескольких контекстов или нескольких классов одного и того же контекста (например, контроллеры), чтобы избежать дублированного кода, у вас есть две возможности (по крайней мере):

1 - Используйте AbstractController и сделать ваши контроллеры расширением абстрактного.

2- Использовать сервис (то есть CsvManager).

Если вы хотите, чтобы некоторые примеры реализации, см. Symfony2 reusable functions in controllers и глава Controller as a service в документации Symfony.

Пример реализации услуг:

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

+1. Из личного опыта я бы пошел с № 2 - вы можете создать службу экспорта, которая возвращает ваш потоковый ответ и повторно использовать его очень легко, передавая любые данные, которые вам нужны. Тогда вы просто получите ответ своего контроллера от службы –

+2

Определенно вариант №2! Как упоминает @JasonRoman, ваш код будет чистым и многоразовым. Проблема с методом № 1 заключается в том, что ваш абстрактный контроллер будет иметь логику, которая не нужна другим контроллерам или не будет использоваться в случае спроса на несколько абстрактных контроллеров. – Aistis

+0

Я согласен с тобой. Он также может использовать эту услугу как '_controller' маршрута и напрямую отсылать ответ от него – chalasr