在CakePHP驱动的站点中,我应该把这个方法放在哪里?

在CakePHP驱动的站点中,我应该把这个方法放在哪里?,php,cakephp,Php,Cakephp,我正在使用CakePHP编写一个应用程序,我不确定应该将我的generateMpurl函数放在哪里 function generateMapUrl($id = null) { if ( !$id ) { $this->Session->setFlash('Invalid Property Id'); } $this->read(null, $id); $url = "http://maps.google.com/maps?oi=

我正在使用CakePHP编写一个应用程序,我不确定应该将我的
generateMpurl
函数放在哪里

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控制器调用此方法)

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

< P>我可以考虑创建AdvrasMaPulrEng生机类并使用它来创建URL。你可以给它一个地址。这样,您就不会因为担心URL或映射而混淆模型,也不会担心在多个控制器中部署相同的功能。

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

至少有三种情况发生:

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

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

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

function generateMapUrl($id = null) {
  $this->recursive = -1;
  if (!$this->read(null, $id)) {
    return false;
  } 
  $url = "http://maps.google.com/maps?oi=map&amp;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');
  }
}

我假设您指的是地址控制器?也许您也会建议创建一个名为UrlGenerator的抽象基类?也许,但它实际上取决于应用程序的业务域。更重要的是,中心域对象可能应该具有更多分解良好的职责。如果它不是系统的重要部分,那么您可能不应该在它上花费太多时间。回答得好,这对我来说最有意义,因为我只是格式化地址数据。值得注意的是,它需要是数据['Address']['street'],而不是数据['street'],但这是我的错。谢谢你的回答!