このメソッドを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
を呼び出すことができます。しかし、メソッドをどこに置くべきかはわかりません...アドレスコントローラー?アドレスモデル? (注:このメソッドは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の作成は、専用のヘルパークラスで処理する必要があります。コントローラでチェックを実行するのが最善である可能性が高く、実際のチェックコードは他の場所にあります。ユーザーがいる特定の場所に必要な特別な処理を行う必要があるため、エラー処理はコントローラー上で行う必要があります。最後に、呼び出し自体は、もちろんコントローラー上で行われるべきです。