【发布时间】: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