【问题标题】:Zend Framework and Preventing Fat ControllersZend 框架和防止胖控制器
【发布时间】:2011-03-22 06:34:07
【问题描述】:

避免胖控制器

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

这意味着我必须获取提要,然后使用我的模型。 提要抓取只是为了展示它的工作原理,但现在它是一个 Action Helper。

我在 Zend 框架中使用数据映射器模式。我讨厌我在我的控制器中这样做。所有这些 setProperty()->setProperty()->setProperty() 看起来都非常丑陋,我觉得我做错了地方?只创建某种 服务层 在其中传递整个 $feed 然后在该类中实例化我的模型和映射器会是更好的选择吗?

另外,我需要规范化,这意味着我应该使用事务,但我不确定应该从哪里开始我的事务。由于我目前做事的方式,我唯一能考虑的地方就是我的控制器。 哇......那将是一个糟糕的地方

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

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);

}

【问题讨论】:

    标签: php zend-framework controller datamapper


    【解决方案1】:

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

    【讨论】:

    • 贾斯汀,但是当您插入时,您不能使用单个数据映射器类,可以吗?你需要几个?
    【解决方案2】:

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

    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);
    

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

    【讨论】:

      猜你喜欢
      • 2012-04-22
      • 2013-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多