Я думаю, что смог выполнить транзакцию с помощью «транзакции».
В моих тестах, если в сущности «Клиенты» есть ошибка, сущность «Пользователи» не сохраняется.
Я не знаю, если это лучший способ сделать, но это сработало
public function register()
{
$locator = TableRegistry::getTableLocator();
$userTable = $locator->get("Users");
$clientTable = $locator->get("Clients");
$user = $userTable->newEntity();
$client = $clientTable->newEntity();
if ($this->request->is('post')) {
$request = $this->request->getData();
$user = $userTable->patchEntity($user, $request);
$conn = ConnectionManager::get('default');
try {
$conn->transactional(function ($conn) use ($userTable, $clientTable, $user, $client, $request) {
$userTable->saveOrFail($user, [
'atomic' => false
]);
$request['user_id'] = $user->id;
$client = $clientTable->patchEntity($client, $request);
$clientTable->saveOrFail($client, [
'atomic' => false
]);
});
$this->Flash->success(__('The user has been registered.'));
return $this->redirect([
'action' => 'login'
]);
} catch (\Cake\ORM\Exception\PersistenceFailedException $e) {
$this->Flash->error(__('Error on save: {0}', $e->getMessage()));
return $this->redirect([
'action' => 'register'
]);
}
$this->Flash->error(__('The user could not be registered. Please, try again.'));
}
$this->set(compact('$user'));
}