我应该在CakePHP驱动的网站中将此方法放在哪里?

时间:2009-03-04 00:26:34

标签: php cakephp

我正在使用CakePHP编写一个应用程序,我不确定应该在哪里放置generateMapUrl函数。

function generateMapUrl($id = null) {
    if ( !$id ) {
        $this->Session->setFlash('Invalid Property Id');
    } 
    $this->read(null, $id);
    $url = "http://maps.google.com/maps?oi=map&q=";
    $url .= $this->data['street_num'] . '+';
    $url .= $this->data['street'] . '+';
    $url .= $this->data['city'] . '+';
    $url .= $this->data['province'] . '+';
    $url .= $this->data['country'] . '+';
    $url .= $this->data['postal_code'];

    return $url;
}

我有以下结构:

  

预订(型号和控制器)
  属性(型号和控制器)
  地址(型号和控制器)

预订hasOne财产和财产hasOne地址。我希望能够为任何地址致电generateMapUrl。我不确定在哪里放置方法虽然...地址控制器?地址模型? (注意:我从预约控制器调用此方法)

5 个答案:

答案 0 :(得分:3)

在Controller中,它有会话数据。模型不应该知道任何会话状态。

答案 1 :(得分:0)

我可能会考虑创建一个AddressMapUrlGenerator类并使用它来创建URL。你可以传递一个地址。这样,你就不会因为对网址或地图的担忧而混淆模型,并且你不会担心将来同一个功能分散在多个控制器中。

答案 2 :(得分:0)

在模型中构建一个GoogleAddress类。然后在控制器中使用GoogleAddress。

答案 3 :(得分:0)

generateMapUrl()方法应该是Address模型中的一个方法,因为它处理提取和格式化Address数据,但是应该返回false并且不包含会话调用:

function generateMapUrl($id = null) {
  $this->recursive = -1;
  if (!$this->read(null, $id)) {
    return false;
  } 
  $url = "http://maps.google.com/maps?oi=map&q=";
  $url .= $this->data['street_num'] . '+';
  $url .= $this->data['street'] . '+';
  $url .= $this->data['city'] . '+';
  $url .= $this->data['province'] . '+';
  $url .= $this->data['country'] . '+';
  $url .= $this->data['postal_code'];  
  return $url;
}

然后你可以从任何控制器调用它并在那里使用会话调用:

function x() {
  if (!$mapUrl = ClassRegistry::init('Address')->generateMapUrl($addressId)) {
    $this->Session->setFlash('Invalid Property Id');
  }
}

答案 4 :(得分:-1)

至少,有三件事情发生了:

1)创建URL 2)错误处理 3)虽然不明确,但实际调用。

URL的创建应由专用的助手类处理。最好在控制器上进行检查,实际的检查代码将驻留在其他地方。错误处理应该在控制器上,因为它必须执行用户所在的特定位置所需的任何特殊操作。最后,呼叫本身当然应该在控制器上进行。