- レポジトリ内で、\Exceptionで例外をcatchし、true/falseでハンドリングしている箇所が多々ある
- ログ出力も行っておらず、何が発生したかわかりづらい
- 外部キー制約違反など、コントローラ側で制御したほうがよいのでは
- 不要なトランザクション
- TransactionListenerにより、アプリケーションの起動、終了タイミングでbegin/commitが行われるようになっているため、レポジトリ内でのトランザクションは不要
https://github.com/chihiro-adachi/ec-cube/commit/fefcf43819c6a77d0d920b5df8b259d933ad28a3
対象レポジトリ | 対応 |
---|---|
CategoryRepository::save | 不要なトランザクション, try-catchブロックを削除 |
CategoryRepository::delete | 不要なトランザクション, try-catchブロックを削除, 外部キー制約違反はコントローラ側で制御する |
ClassCategoryRepository::up | 使用していない |
ClassCategoryRepository::down | 使用していない |
ClassCategoryRepository::save | 不要なトランザクション, try-catchブロックを削除 |
ClassCategoryRepository::delete | 不要なトランザクション, try-catchブロックを削除, 外部キー制約違反はコントローラ側で制御する |
ClassCategoryRepository::toggleVisibility | 不要なトランザクション, try-catchブロックを削除 |
ClassNameRepository::up | 不要なトランザクション, try-catchブロックを削除 |
ClassNameRepository::down | 不要なトランザクション, try-catchブロックを削除 |
ClassNameRepository::save | 不要なトランザクション, try-catchブロックを削除 |
ClassNameRepository::delete | 不要なトランザクション, try-catchブロックを削除, 外部キー制約違反はコントローラ側で制御する |
CustomerAddressRepository::deleteByCustomerAndId | deleteでよい.Customerのチェックはコントローラ側で制御する .外部キー制約 違反は発生しない |
CustomerFavoriteProductRepository::deleteFavorite | deleteでよい.Customerのチェックはコントローラ側で制御する. 外部キー制約違反は 発生しない |
MemberRepository::up | 不要なトランザクション, try-catchブロックを削除 |
MemberRepository::down | 不要なトランザクション, try-catchブロックを削除 |
MemberRepository::save | 不要なトランザクション, try-catchブロックを削除 |
MemberRepository::delete | 不要なトランザクション, try-catchブロックを削除, 外部キー制約違反はコントローラ側で制御する |
NewsRepository::up | 不要なトランザクション, try-catchブロックを削除 |
NewsRepository::down | 不要なトランザクション, try-catchブロックを削除 |
NewsRepository::save | 不要なトランザクション, try-catchブロックを削除 |
NewsRepository::delete | 不要なトランザクション, try-catchブロックを削除 |
ProductRepository::get | 既にdeprecated. findに移行する |
1レコードを取得するメソッドは、NonUniqueResultExceptionやNoResultExceptionをthrowする場合がある
- getSingleScalarResult -> NonUniqueResultException, NoResultException
- getSingleResult -> NonUniqueResultException, NoResultException
- getOneOrNullResult -> NonUniqueResultException
- MAXやCOUNTのクエリで使用されている
- COALESCEしたほうがよい
実装にばらつきがあるため、統一する
CustomerRepository::getProvisionalCustomerBySecretKey getSingleResultで、コントローラ側で例外処理 https://github.com/EC-CUBE/ec-cube/blob/experimental/physical-delete/src/Eccube/Repository/CustomerRepository.php#L386 https://github.com/EC-CUBE/ec-cube/blob/experimental/physical-delete/src/Eccube/Controller/EntryController.php#L249
CustomerRepository::getRegularCustomerByEmail getOneOrNullResultでコントローラ側ではnullチェック https://github.com/EC-CUBE/ec-cube/blob/experimental/physical-delete/src/Eccube/Repository/CustomerRepository.php#L389 https://github.com/EC-CUBE/ec-cube/blob/experimental/physical-delete/src/Eccube/Controller/ForgotController.php#L122
findの挙動と合わせると、nullチェックのほうが扱いやすい?
- データの不整合なので、本来はシステムエラーでよいはず
- 2系からのデータ移行や、多重アクセスのため重複データができたりなどがある
- 現状issueで報告されているのはmember/customerくらい?
doctrine/dbalで発生する例外
- ConnectionException
- ConstraintViolationException
- DatabaseObjectExistsException
- DatabaseObjectNotFoundException
- DriverException
- ForeignKeyConstraintViolationException
- InvalidArgumentException
- InvalidFieldNameException
- NonUniqueFieldNameException
- NotNullConstraintViolationException
- ReadOnlyException
- ServerException
- SyntaxErrorException
- TableExistsException
- TableNotFoundException
- UniqueConstraintViolationException