Cakephp PHP WEB開発

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

※本サイトはPR表記を含みます。


メソッド内でトランザクションが処理されている場合、データの整合性を担保するために、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 {
    $entity = $this->newEntity($this->getRequest()->getData(), ['validate' => false]);
    if (!$this->save($entity)) {
        throw new \Exception('処理に失敗しました');
    }
    if (!$this->Logs->save($entity)) {
        throw new \Exception('ログ追加に失敗しました');
    }
    $dataSourse->commit();
} catch (\Exception $e) {
    $dataSourse->rollback();

    return $e->getMessage();
}

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

use Cake\Datasource\ConnectionManager;

// クラスメソッド内などで
$dataSource = ConnectionManager::get('default');
$dataSource->begin();
try {
    $entity = $this->Hoges->newEntity($this->getRequest()->getData(), ['validate' => false]);
    if (!$this->save($entity)) {
        throw new \Exception('処理に失敗しました');
    } if (!$this->Logs->save($entity)) {
        throw new \Exception('ログ追加に失敗しました');
    }
    $dataSource->commit();

    return $this->redirect('成功時の遷移先');
} catch (\Exception $e) {
    $dataSource->rollback();
    $this->Flash->error($e->getMessage());

    return $this->redirect('失敗時の遷移先');
}

 

-Cakephp, PHP, WEB開発
-