3.7.7 コールバックメソッド
CakePHP のモデル操作の前後でなんらかのロジックを入れたい場合、モデルのコールバックを使用します。コールバック関数はモデルクラス(AppModel も含みます)で定義できます。この特別な関数の返り値には注意してください。
find に関係する操作の前に呼び出されます。このコールバックに渡された $queryData は現在のクエリに関する情報: 条件、フィールド等 をもっています。
find 操作を開始したくない場合($queryData オプションに関連した決定に基づいて)、false を返します。そうでない場合は、変更した $queryData を返すか、find に渡したいものを返します。
このコールバックを使用して、ユーザの役割に基づいて find 操作を制限したり、現在の読み込みに基づいてキャッシュを使用することを決めたりできます。
このコールバックを使用すると、find 操作から返された結果を変更したり、他の find 後のロジックを実行したりできます。このコールバックに渡される $results パラメータは、モデルの find 操作の返り値をもちます。たとえば、次のようになります:
$results = array(
0 => array(
'ModelName' => array(
'field1' => 'value1',
'field2' => 'value2',
),
),
);
$results = array(0 => array('ModelName' => array('field1' => 'value1','field2' => 'value2',),),);
このコールバックの返り値は、このコールバックを引き起こした find 操作の(可能であれば変更した)結果であるべきです。
$primary が false である場合、$results の形式は期待しているものとは少し異なります。通常の find 操作で取得する結果ではなく、次のようになります:
$results = array( 'field_1' => 'value', 'field_2' => 'value2' );
$results = array('field_1' => 'value','field_2' => 'value2');
再帰的な find を使用している場合、$primary が true であると期待しているコードでは、PHP から "Cannot use string offset as an array" という fatal エラーが起こるでしょう。
このコールバックを使用すると、バリデートする前にモデルのデータを変更できます。追加でより複雑なバリデーションルールを追加するために Model::invalidate() を使用することができます。この関数内では、モデルのデータは $this->data を通してアクセスできます。この関数は true を返さなければなりません。そうでない場合は、現在の save() 実行が異常終了します。
この関数には、保存前のロジックを置きます。この関数は、モデルのデータのバリデーションに成功した後すぐ、そしてデータが保存される前に実行されます。save 操作を続けたい場合は、この関数は true を返す必要があります。
データを保存する前に実行する必要があるデータ操作ロジックがある場合に、このコールバックは特に有用です。ストレージエンジンが特別な形式で日付を扱う場合に、$this->data でデータにアクセスし変更することができます。
すべての save 操作のすぐ後に実行すべきロジックがある場合、このコールバックメソッド内にロジックを置きます。
新しいオブジェクトが(更新ではなく)生成される場合、 $created の値は true になります。
この関数に削除前に実行するロジックを置きます。削除を続けたい場合、この関数で true を返します。処理を止めたい場合は、false を返します。
このコールバックメソッド内で削除の後に実行したいロジックを置きます。
問題が起こった場合に呼び出されます。
3.7.7.1 beforeFind
beforeFind(mixed $queryData)
find 関連の操作の前に呼び出されます。このコールバックに渡される $queryData は現在のクエリーについての情報を持っています: conditions, fields などです
find 操作を開始したくない場合(おそらく $queryData オプションに関連した決定に基づきます)、false を返します。もしそうでない場合は、変更した $queryData を返すか、find に渡したいものやそれ相応のものを返します。
ユーザのルールに基づいて find 操作を制限するためにこのコールバックを使用したり、現在の読み込みに基づいて決定をキャッシュしたりするかもしれません。
3.7.7.2 afterFind
afterFind(array $results, bool $primary)
find 操作から返された結果を変更するため、あるいは他の find 後にロジックを実行するためにこのコールバックを使用します。このコールバックに渡された $results パラメータはモデルの find 操作から返された結果を含みます。たとえば次のようなものです:
$results = array(
0 => array(
'ModelName' => array(
'field1' => 'value1',
'field2' => 'value2',
),
),
);
$results = array(0 => array('ModelName' => array('field1' => 'value1','field2' => 'value2',),),);
このコールバックの返り値はこのコールバックを呼び出した find 操作の(おそらくは変更された)結果です。
$primary が false の場合、$results のフォーマットは期待しているものとは少し違っています。通常の find 操作の結果の代わりに次のようになります:
$results = array( 'field_1' => 'value', 'field_2' => 'value2' );
$results = array('field_1' => 'value','field_2' => 'value2');
再帰的に find を使用した場合、$primary が true であると期待しているコードは "Cannot use string offset as an array" という fatal エラーになるでしょう。
3.7.7.3 beforeValidate
beforeValidate()
バリデートされる前にモデルのデータを変更するためにこのコールバックを使用します。Model::invalidate() を使用して追加でより複雑なバリデーションルールを追加するために使用できます。このコンテキストでは、モデルのデータは $this->data を通してアクセスできます。この関数は true を返さなければなりません。そうでない場合、現在の save() 実行がアボートします。
3.7.7.4 beforeSave
beforeSave()
この関数に保存前のロジックを置きます。この関数はモデルのデータがバリデートに成功した後、データが保存される前に実行されます。save 操作を継続するには、この関数は true を返す必要がありますす。
このコールバックは、データが保存される前に実行する必要のあるデータメッセージングロジックに特に便利です。ストレージエンジンが特別な形式の日付を必要とする場合、$this->data でアクセスし、変更します。
3.7.7.5 afterSave
afterSave(boolean $created)
各 save 操作の後に実行する必要のあるロジックがある場合、このコールバックメソッドに置きます。
新しいオブジェクトが(更新ではなく)生成された場合、$created は true になります。
3.7.7.6 beforeDelete
beforeDelete()
この関数に 削除前ロジックを置きます。削除を継続したい場合は、この関数は true を返す必要があります。アボートしたい場合は false を返します。
3.7.7.7 afterDelete
afterDelete()
このコールバックメソッドに、削除の後に実行したいロジックを置きます。
3.7.7.8 onError
onError()
問題が起こった場合に呼び出されます。
