代码之家  ›  专栏  ›  技术社区  ›  Layke

Zend框架和防止FAT控制器

  •  3
  • Layke  · 技术社区  · 14 年前

    避免脂肪控制器

    所以我在使用Zend框架,我有一个问题涉及到用我的一个操作来防止胖控制器。基本上,我正在将一个csv文件规范化到我的数据库中。

    这意味着我必须得到饲料,然后使用我的模型。 抓取提要只是为了展示它是如何工作的,但现在这是一个动作助手。

    我正在使用Zend框架中的数据映射器模式。我 憎恨 我在我的控制器里做这个。所有这些setproperty()->setproperty()->setproperty()看起来都非常简单,我觉得我在做错事?只是创造一种 服务层 在那里我通过了整个 美元饲料 然后在这个类中,我实例化了我的模型和映射器?

    另外,我需要规范化,这意味着我应该使用事务,但我不确定应该在哪里启动事务。因为我现在做事的方式,我唯一能考虑的地方就是我的控制器。 真的。。那将是一个可怕的地方 .

    如何从控制器中获取模型行为和操作?

    导入控制器.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 回复  |  直到 14 年前
        1
  •  3
  •   Tim Fountain    14 年前

    服务层可能就是我想要的方式。因此,您将创建一个如下所示的服务类:

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

    然后将csv_to_数组调用后的所有控制器方法代码移动到该方法中,使控制器方法的结尾看起来像这样:

    $feed = $this->csv_to_array(trim($response->getBody()));
    
    $service = new Your_Service_Import();
    $service->importFromCsv($feed);
    

    这使得测试导入代码更容易(因为它在一个独立的类中),并且更容易在应用程序的其他部分中重用。

        2
  •  1
  •   Justin    14 年前

    我会比@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);