Cakephp PHP プログラミング

【Cakephp2→4】複数トランザクションの移行


メソッド内で複数のトランザクションが処理されている場合、データの整合性を担保するために、try~catch を利用することになると思います。

以下、Cake2からCake4への移行する際の参考例です。

Cakephp2: トランザクション例

try {
    $this->begin();
    // なんか保存系の処理とか

    $this->commit();
} catch (Exception $e) {
    $this->rollback();
    throw $e; 
}

トランザクションの処理の書き方は大体決まっているので、おおよそCake2で実装されているのは、例に示したような感じになると思います。

Cake4に移行する際は、モデルの場合、$this->getConnection() すればよく、コントローラの場合は ConnectionManager::get()  を利用すればよいでしょう。

Cakephp4: トランザクション例: モデル

// メソッド内に記述
$dataSource = $this->getConnection();

try {
    if (!$this->save($this->getRequest()->getData())) {
        $dataSource->rollback();
        throw new \Exception('処理に失敗しました');
    }
    if (!$this->Logs->save()) {
        $dataSource->rollback();
        throw new \Exception('ログ追加に失敗しました');
    }
    $dataSourse->commit();
}  catch (\Exception $e) {
    $dataSourse->rollback();

    return $e->getMessage();
}

Cakephp4: トランザクション例: コントローラー

use Cake\Datasource\ConnectionManager;
// クラスメソッド内などで
try {
        $dataSource= ConnectionManager::get('default');
        $dataSource->begin();
        // なんか保存系の処理とか

        $dataSource->commit();
    } catch (\Exception $e) {
        $dataSource->rollback();
        
        return;
    }
}

 

-Cakephp, PHP, プログラミング
-