0

我正在使用 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任何地址。我不确定将方法放在哪里......地址控制器?地址模型?(注意:我从 Bookings 控制器调用此方法)

4

5 回答 5

3

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

于 2009-03-04T00:27:45.663 回答
0

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

于 2009-03-04T00:36:29.103 回答
0

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

于 2009-03-04T01:01:59.497 回答
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');
  }
}
于 2009-03-04T09:53:50.527 回答
-1

至少,发生了三件事:

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

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

于 2009-03-04T01:03:11.193 回答