Zend Framework и предотвращение жировых контроллеров - PullRequest
3 голосов
/ 28 июля 2010

Избавление от жирного контроллера

Итак, я использую Zend Framework, и у меня есть вопрос, связанный с предотвращением контроллеров с помощью одного из моих действий. В основном я нормализую файл CSV в моей базе данных.

Это означает, что мне нужно получить канал, а затем использовать мою модель. Захват ленты только для того, чтобы показать, как он работает, но теперь это Action Helper.

Я использую шаблон Data Mapper с Zend Framework. Я ненавижу , что я делаю это в моем контроллере. Все эти setProperty () -> setProperty () -> setProperty () выглядят невероятно беспорядочно, и я чувствую, что делаю это не в том месте? Будет ли лучшим вариантом просто создать какой-то сервисный слой , где я передаю весь $ feed , а затем в этом классе я создаю экземпляры моих Моделей и моего Mapper?

Кроме того, мне нужно нормализоваться, что означает, что я должен использовать транзакцию, но я не уверен, где мне следует начинать транзакцию. Из-за того, как я сейчас работаю, единственное место, которое я когда-либо мог рассмотреть, это мой Контроллер. Ого ... это было бы ужасное место .

Как я могу получить поведение модели и операции из моего контроллера?

ImportController.php

public function indexAction() {
        $start = $this->getRequest()->getParam('start');
        $end = $this->getRequest()->getParam('end');
        $url = "http://www.domain.com/admin/GetBookingData.aspx";       

        $client = new Zend_Http_Client();
        $client->setParameterGet('dateEnteredMin', $start);
        $client->setParameterGet('dateEnteredMax', $end);
        $client->setParameterGet('login', 'login');
        $client->setParameterGet('password', 'password');
        $client->setUri( $url );
        $client->setConfig(array(
            'maxredirects' => 0,
            'timeout'      => 30));
        // Send the request. 
        $response = $client->request();

        // Grab the feed from ->getBody and add it to $feed
        $feed = $this->csv_to_array(trim($response->getBody()));


        // The first item in the array is the heading in the CSV, so we can remove it from the array using shift().
        $title = array_shift($feed);

        // Create my Models and Mappers.
            // ***  EVERYTHING BELOW HERE IS WHAT I DON'T LIKE ***
        $bookings =         new Bookings_Models_Bookings();
        $property =         new Bookings_Models_Property();
        $clients =      new Bookings_Models_Clients();

        $bookingsMapper =   new Bookings_Models_Bookings_Mapper();
        $propertyMapper =   new Bookings_Models_Property_Mapper();
        $clientsMapper =    new Bookings_Models_Clients_Mapper();

        $bookings->setId($feed[9])
            ->setPropertyId($feed[1])
            ->setClientId($feed[2])
            ->setDate($feed[4]);
        $bookingsMapper->save($bookings);

        $property->setId($feed[1])
            ->setPropertyName($feed[23])
        $propertyMapper->save($bookings);

        $clients->setId($feed[2])
            ->setFirstName($feed[20])
            ->setLastName($feed[21])
        $clientsMapper->save($clients);

}

Ответы [ 2 ]

3 голосов
/ 29 июля 2010

Служебный уровень - это, вероятно, путь, по которому я бы пошел. Таким образом, вы создадите класс обслуживания, который будет выглядеть примерно так:

class Your_Service_Import
{
    public function importFromCsv($csv)
    {
        // etc.
    }
}

Затем вы бы переместили весь код метода вашего контроллера после вызова csv_to_array в этот метод, и конец метода вашего контроллера выглядел примерно так:

$feed = $this->csv_to_array(trim($response->getBody()));

$service = new Your_Service_Import();
$service->importFromCsv($feed);

Это облегчает тестирование кода импорта (так как он находится в отдельном классе) и позволяет повторно использовать его в других частях вашего приложения.

1 голос
/ 29 июля 2010

Я бы пошел на один шаг (или два шага) дальше, чем @Tim Fountain

  1. Создать помощника службы или домена, который принимает начало, конец (и может быть настроен с помощью пароля и имени пользователя иurl) и возвращает список csv в виде массива.
  2. Создайте службу, которая отображает известный массив измерений (csv) и сопоставляет его с базой данных.

Ваш контроллер будет затемпросто будь

$start = $this->getRequest()->getParam('start');
$end = $this->getRequest()->getParam('end');
$dataService = new Your_Service_Get();
$data = $dataService->get($start, $end);
$mapService = new Your_Service_Map();
$mapService->map($data);
...