CakePHP -Verhalten nach der Find nicht auf verwandte Modelle aufgerufen
-
26-09-2019 - |
Frage
Ich verwende eine AfterFind -Funktion, um Daten aus einer Find -Funktion zu ändern. Es funktioniert gut. Wenn ich die Afterfind -Funktion in ein Verhalten (in einem Plugin) bewege, funktioniert es immer noch, aber nur, wenn das Interessensmodell das primäre Modell ist, dh es wird nicht aufgerufen, wenn das Modell ein anderes Modell gehört. Gibt es eine Möglichkeit, das zu rund um das? Ich benutze Cake 1.3.4. Dies ist eine vereinfachte Version des Verhaltens:
class ChemicalStructureBehavior extends ModelBehavior {
function afterFind(&$model, $results, $primary) {
foreach ($results as &$unit) {
// format chemical formula (with subscripts)
$unit[$model->alias]['chemical_formula_formatted'] = preg_replace('/([0-9]+)/i', '<sub>$1</sub>', $unit[$model->alias]['chemical_formula']);
}
return $results;
}
}
Lösung
Ich denke, ich würde eines von 2 Dingen tun, je nachdem, wie allgemein der Codeblock gilt:
- Universelle Version: Verwenden Sie kein Verhalten, sondern geben Sie Ihren Methodenblock in ein
AppModel::afterFind
- Chirurgische Version: Verwenden Sie ein Verhalten und befestigen Sie es jedem Modell, das die Funktionalität teilen muss.
Andere Tipps
Ein Verhalten soll nicht an verwandten Modellen arbeiten, zum Beispiel, wenn Sie diese beiden Modelle haben:
App/models/product.php
<?php
class Product extends AppModel{
var $belongsTo = array('Category');
var $actsAs = array('SomeBehavior');
}
?>
App/models/category.php
<?php
class Category extends AppModel {
var $hasMany = array('Product');
}
?>
Ein bisschen veravior wird nur beim Aufrufen von Methoden für Produkte ausgeführt, da das Verhalten nicht mit der Kategorie verbunden ist
http://github.com/m3nt0r/eventful-cakephp
Richten Sie ein Ereignis ein, das die Formatierung ausführt - auslösen Sie dieses Ereignis, wie Sie es brauchen. Einfach wie Kuchen.