Der Inhalt dieses Artikels befasst sich mit der Entwicklung von Yii2: Wie man Transaktionen auf eine abschlussähnliche Weise kapselt. Ich hoffe, dass er für Sie hilfreich ist.
Beim Ausführen einer Transaktion im Controller lautet der allgemeine Code wie folgt:
$transaction = Yii::$app->db->beginTransaction(); try { //一些业务代码 $transaction->commit(); } catch (\Exception $e) { $transaction->rollBack(); throw $e; }
Also dachte ich, diese Codestruktur ist nur // Einige Geschäftscodes sind anders, aber das muss so sein Oftmals wiederholt werden, ist das nicht überflüssig? Und nein! Gut! sehen! Daher habe ich zunächst versucht, eine ähnliche Frage zum Stackflow zu finden. Es gibt jedoch eine Lösung, die dabei auftritt, z. B. verschachtelte Transaktionen Klicken Sie hier, um die Fragen und Antworten anzuzeigen.
Unser Yii-Framework bietet eine Methodentransaktion. Auf den ersten Blick scheint es, dass es das Problem der Parameterübergabe nicht lösen kann. Wenn wir nach unten schauen, heißt die Methode wie folgt:
rreeeWir werfen einen Blick auf den Quellcode dieser Methode
Yii::$app->db->transaction(function() { //一些业务代码 });
Diese Methode akzeptiert eine Rückruffunktion und die Isolationsstufe der Transaktion
Von hier aus können wir sehen, dass diese Methode zwar Duplikate löst Code, es gibt noch einige Probleme, die ungelöst sind:
Zuerst müssen wir die von dieser Methode ausgelöste Ausnahme außerhalb des Empfangs behandeln. Wir können sie nicht direkt auslösen, was für den Client sehr unfreundlich ist.
Zweitens: Ohne Protokollierung ist es nicht einfach, ein Problem zu beheben, selbst wenn es auftritt.
Drittens: Tatsächlich ist es immer noch die erste Frage. Wenn wir jede Ausnahme behandeln und eine Schicht von try...catch... außerhalb der Transaktionsmethode verschachteln müssen, dann scheint es nicht anders zu sein, als wenn wir nicht kapseln Es?
Nach dem Prinzip, dass Methoden erweitert, aber nicht geändert werden können, sollten wir diese Methode in unserer eigenen öffentlichen Methode überladen. Der Überladungscode lautet wie folgt:
/** * Executes callback provided in a transaction. * * @param callable $callback a valid PHP callback that performs the job. Accepts connection instance as parameter. * @param string|null $isolationLevel The isolation level to use for this transaction. * See [[Transaction::begin()]] for details. * @throws \Exception|\Throwable if there is any exception during query. In this case the transaction will be rolled back. * @return mixed result of callback function */ public function transaction(callable $callback, $isolationLevel = null) { $transaction = $this->beginTransaction($isolationLevel); $level = $transaction->level; try { $result = call_user_func($callback, $this); if ($transaction->isActive && $transaction->level === $level) { $transaction->commit(); } } catch (\Exception $e) { $this->rollbackTransactionOnLevel($transaction, $level); throw $e; } catch (\Throwable $e) { $this->rollbackTransactionOnLevel($transaction, $level); throw $e; } return $result; }
Dann zurück zur Frage So übergeben Sie Parameter: Wir können Abschlüsse verwenden und einen Teil des Pseudocodes wie folgt veröffentlichen:
public static function TransactionExecute(callable $function,$level=null) { try{ \Yii::$app->db->transaction($function,$level); }catch (\Exception $e){ //记录日志 \Yii::error($e->getMessage()); //这里可以理解成抛出自定义的异常类。 (new self())->returnWayTip(1004, 'trans异常错误'); } }
Verwandte Empfehlungen:
Wie generiert PHP JSON? PHP-Methodencode zum Generieren von JSON
Das obige ist der detaillierte Inhalt vonYii2-Entwicklung: So kapseln Sie Transaktionen auf eine abschlussähnliche Weise. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!