このメソッドをCakePHP駆動のサイトのどこに置くべきですか?

StackOverflow https://stackoverflow.com/questions/608812

  •  03-07-2019
  •  | 
  •  

質問

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コントローラーから呼び出しています)

役に立ちましたか?

解決

generateMapUrl()メソッドは、アドレスデータのフェッチとフォーマットを処理するため、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');
  }
}

他のヒント

コントローラーには、セッションデータがあります。モデルは、セッションの状態を認識してはなりません。

AddressMapUrlGeneratorクラスを作成し、それを使用してURLを作成することを検討できます。アドレスを渡すことができます。そうすれば、URLやマップに関する心配でモデルを混乱させることはありません。また、同じ機能が複数のコントローラーに広がることを心配することはありません。

モデルでGoogleAddressクラスを作成します。次に、コントローラーでGoogleAddressを使用します。

少なくとも、次の3つのことが起こっています。

1)URLの作成 2)エラー処理 3)明示的ではありませんが、実際の呼び出し。

URLの作成は、専用のヘルパークラスで処理する必要があります。コントローラでチェックを実行するのが最善である可能性が高く、実際のチェックコードは他の場所にあります。ユーザーがいる特定の場所に必要な特別な処理を行う必要があるため、エラー処理はコントローラー上で行う必要があります。最後に、呼び出し自体は、もちろんコントローラー上で行われるべきです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top