ThinkPHP: Das zweite von drei leistungsstarken Tools für Modelle (Modifikator)

爱喝马黛茶的安东尼
Freigeben: 2019-12-16 17:01:07
nach vorne
2666 Leute haben es durchsucht

ThinkPHP: Das zweite von drei leistungsstarken Tools für Modelle (Modifikator)

Modifikator ist eines der drei mächtigsten „Werkzeuge“ des Modells. In diesem Artikel fassen wir die Verwendung des Modifikators und einige Vorsichtsmaßnahmen zusammen.

Modifikator definieren

Die Funktion des Modifikators besteht darin, einige notwendige Datenverarbeitungen durchzuführen, bevor die Modellobjektdaten in die Datenbank geschrieben werden. Die Standarddefinition des Modifikators lautet wie folgt:

public function setFieldNameAttr($value, $data)
{
    // 对value值进行处理 data参数是当前全部数据
    // 返回值就是实际要写入数据库的值
    return $value;
}
Nach dem Login kopieren

FieldName entspricht dem Feld field_name der Datentabelle (achten Sie auf die Spezifikationen der Datentabellenfelder und die Definitionsspezifikationen der Modifikatormethode, da es sonst zu Fehlern kommt).

Grundsätzlich sollte jeder Modifikator nur die Daten des entsprechenden Feldes verarbeiten, es ist jedoch zulässig, bei Bedarf mehrere Felder gleichzeitig zu verarbeiten.

Das Folgende ist ein Beispiel

public function setBirthdayAttr($value, $data)
{
    // 格式化生日数据
    $birthday = strtotime($value);
    // 根据生日判断年龄
    $age = getAgeByBirthday($birthday);
    // 赋值年龄数据
    $this->setAttr('age', $age);
    return $birthday;
}
public function setAgeAttr($value,$data)
{
    return floor($value);
}
Nach dem Login kopieren

Der Grund, warum die setAttr-Methode verwendet wird, besteht darin, sicherzustellen, dass die Alterszuweisungsoperation weiterhin einen separaten Modifikator durchlaufen kann. Wenn Sie keine zusätzlichen Modifikatoren haben, können Sie es auch als

public function setBirthdayAttr($value, $data)
{
    // 格式化生日数据
    $birthday = strtotime($value);
    // 根据生日判断年龄
    $age = getAgeByBirthday($birthday);
    // 赋值年龄数据
    $this->data['age'] = $age;
    return $birthday;
}
Nach dem Login kopieren

schreiben. Beachten Sie, dass es nicht als

$this->age = $age;
Nach dem Login kopieren

geschrieben werden darf, da das Zuweisen von Datenobjekten innerhalb des Modells zu Ungenauigkeiten führt Verwechslung mit den internen Attributen des Modells vorhersehbare Konsequenzen.

Wenn Sie möglicherweise andere Felder in einem bestimmten Modifikator ändern, denken Sie daran, dass der Feldmodifikator, den Sie zusätzlich ändern müssen, zugewiesen wurde (oder der Modifikator ausgelöst wurde).

So rufen Sie auf

Die Modifikatormethode muss nicht manuell aufgerufen werden. Nachdem sie gemäß der Definitionsspezifikation definiert wurde, ruft das System sie automatisch unter auf Folgende Umstände:

·Modellobjektzuweisung;

·Aufrufen der Datenmethode von das Modell und der zweite Parameter werden in true übergeben

·Rufen Sie die Speichermethode des Modells auf und übergeben Sie die Array-Daten; >

·Die setAttr-Methode des Modells explizit aufrufen

· definiert die automatische Vervollständigung dieses Feldes; Zum Beispiel definiert das Benutzermodell die Gerätemethode „setPasswordAttr“ zur Änderung.

public function setPasswordAttr($value, $data)
{
    return md5($value);
}
Nach dem Login kopieren

Bei Verwendung wie folgt wird der Wert des in der Datenbank gespeicherten Passwortfelds zum Wert nach md5 („think“).

$user = User::get(1);
$user->password = 'think';
$user->save();
Nach dem Login kopieren

Wenn Sie keine Modifikatoren verwenden, die Daten aber in einigen Fällen manuell steuern möchten, können Sie die folgende Methode ausprobieren.

$user = User::get(1);
$user->data('password', md5('think'));
$user->save();
Nach dem Login kopieren

Es wird derzeit nicht vom Modifikator verarbeitet.

Konflikte vermeiden

Viele Entwickler definieren gerne die automatische Vervollständigung (einschließlich Einfügen und Aktualisieren) für Modifikatoren.

protected $auto = ['password'];
Nach dem Login kopieren

Dies ist ein scheinbar cleverer, aber sehr fataler Fehler vor V5.1.27. Versuchen Sie, ihn zu vermeiden, da er gemäß den zuvor angegebenen Modifikator-Auslösebedingungen dazu führt, dass der Modifikator zweimal ausgeführt wird. Dies stellt einen katastrophalen Fehler dar und führt dazu, dass sich alle Benutzer nach der Registrierung nicht mehr normal anmelden können.

Die Lösung besteht darin, die automatische Vervollständigung des Passwortfelds abzubrechen, da der Modifikator bei jeder Zuweisung eines Werts automatisch ausgelöst wird. Wenn keine Zuweisung erfolgt, bedeutet dies, dass das Passwort nicht geändert wurde. und es gibt keine automatische Vervollständigung.

Autovervollständigungsfelder sind normalerweise Felder, die nicht im Formular enthalten sind und im Allgemeinen Felder sind, die automatisch vom System verarbeitet werden.

Version V5.1.27 hat dieses Problem behoben. Alle Modifikatoren dürfen nur einmal ausgeführt werden, und das oben genannte Problem besteht nicht mehr. Aber es scheint ein neues Problem mit sich gebracht zu haben. Möglicherweise möchten Sie die Daten im Falle des Modells ändern.

User::beforeUpdate(function($user) {
    $user->password = md5('think');
});
Nach dem Login kopieren

stellt fest, dass der Wert der Daten im Modell beforeUpdate nicht geändert werden kann. Der Grund dafür ist, dass der Modifikator des Modells während der ersten Zuweisung ausgeführt wurde und während der zweiten Zuweisung ungültig ist (wird nicht erneut ausgeführt).

Die Lösung besteht darin, die Datenmethode wie zuvor erwähnt zu verwenden, ohne den Modifikator für die Datenzuweisung aufzurufen.

User::beforeUpdate(function($user) {
    $user->data('password', md5('think'));
});
Nach dem Login kopieren

Natürlich ist es besser, den Datenverarbeitungsmechanismus von Modifikatoren, Autovervollständigungen und Modellereignissen zu planen. Verwenden Sie nicht mehrere Mechanismen, um Daten gleichzeitig für ein Feld zu ändern und die Daten in das Feld zu schreiben Die Datenbank sollte und darf nur über diese Methode geändert werden.

Automatische Typkonvertierung

Wenn Ihr Modifikator nur eine Typkonvertierung für Daten durchführt, müssen Sie keinen Modifikator definieren, sondern nur den Feldtyp direkt definieren.

public function setScoreAttr($value, $data)
{
    return (float) $score;
}
Nach dem Login kopieren

Die obige Modifikatormethode kann direkt geändert werden in

protected $type = [
    'score'    =>    'float',
];
Nach dem Login kopieren

Wenn Sie gleichzeitig einen Modifikator und einen Typ für ein Feld definieren, hat der Modifikator Vorrang.

Typdefinitionen können nicht nur einfache Datentypen definieren, sondern auch einige zusätzliche Verwendungszwecke haben. Beispielsweise werden JSON-Typ, Array-Typ und Objekttyp JSON-serialisiert, und der Serialisierungstyp serialisiert die Daten.

Die chinesische PHP-Website bietet eine große Anzahl kostenloser

ThinkPHP-Einführungs-Tutorials

, zum Lernen ist jeder herzlich willkommen! Dieser Artikel wurde reproduziert von: https://blog.thinkphp.cn/817548

Das obige ist der detaillierte Inhalt vonThinkPHP: Das zweite von drei leistungsstarken Tools für Modelle (Modifikator). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:thinkphp.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!