Skip to content

Instantly share code, notes, and snippets.

@chihiro-adachi
Last active September 19, 2017 07:15
Show Gist options
  • Save chihiro-adachi/240b81cd44e296aa1e2390fb4a4cee46 to your computer and use it in GitHub Desktop.
Save chihiro-adachi/240b81cd44e296aa1e2390fb4a4cee46 to your computer and use it in GitHub Desktop.
レポジトリの例外処理

現状

  • レポジトリ内で、\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

getSingleScalarResult

  • MAXやCOUNTのクエリで使用されている
  • COALESCEしたほうがよい

getSingleResult, getOneOrNullResult

実装にばらつきがあるため、統一する

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チェックのほうが扱いやすい?

NonUniqueResultExceptionの扱い

  • データの不整合なので、本来はシステムエラーでよいはず
  • 2系からのデータ移行や、多重アクセスのため重複データができたりなどがある
  • 現状issueで報告されているのはmember/customerくらい?

備考

doctrine/dbalで発生する例外

  • ConnectionException
  • ConstraintViolationException
  • DatabaseObjectExistsException
  • DatabaseObjectNotFoundException
  • DriverException
  • ForeignKeyConstraintViolationException
  • InvalidArgumentException
  • InvalidFieldNameException
  • NonUniqueFieldNameException
  • NotNullConstraintViolationException
  • ReadOnlyException
  • ServerException
  • SyntaxErrorException
  • TableExistsException
  • TableNotFoundException
  • UniqueConstraintViolationException
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment