DynamicRelationSubscriber.php 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <?php
  2. namespace Base\OAuthBundle\EventListener;
  3. use Doctrine\ORM\Events;
  4. use Doctrine\ORM\Event\LoadClassMetadataEventArgs;
  5. use Doctrine\Common\EventSubscriber;
  6. class DynamicRelationSubscriber implements EventSubscriber
  7. {
  8. /**
  9. * {@inheritDoc}
  10. */
  11. public function getSubscribedEvents()
  12. {
  13. return array(
  14. Events::loadClassMetadata,
  15. );
  16. }
  17. /**
  18. * @param LoadClassMetadataEventArgs $eventArgs
  19. */
  20. public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs)
  21. {
  22. // the $metadata is the whole mapping info for this class
  23. $metadata = $eventArgs->getClassMetadata();
  24. $classes = array(
  25. 'Base\OAuthBundle\Entity\AccessToken',
  26. 'Base\OAuthBundle\Entity\AuthCode',
  27. 'Base\OAuthBundle\Entity\RefreshToken'
  28. );
  29. if (!in_array($metadata->getName(), $classes)) {
  30. return;
  31. }
  32. $namingStrategy = $eventArgs
  33. ->getEntityManager()
  34. ->getConfiguration()
  35. ->getNamingStrategy()
  36. ;
  37. $userClass = 'Base\UserBundle\Entity\User';
  38. $OAuthUserClass = '\Base\OAuthBundle\Security\Core\User\CustomOAuthUser';
  39. $metadata->mapManyToMany(array(
  40. 'targetEntity' => class_exists($userClass) ? $userClass : $OAuthUserClass,
  41. 'fieldName' => 'user',
  42. 'cascade' => array('persist'),
  43. 'joinTable' => array(
  44. 'name' => strtolower($namingStrategy->classToTableName($metadata->getName())) . '_user',
  45. 'joinColumns' => array(
  46. array(
  47. 'name' => $namingStrategy->joinKeyColumnName($metadata->getName()),
  48. 'referencedColumnName' => $namingStrategy->referenceColumnName(),
  49. 'onDelete' => 'CASCADE',
  50. 'onUpdate' => 'CASCADE',
  51. ),
  52. ),
  53. 'inverseJoinColumns' => array(
  54. array(
  55. 'name' => 'user_id',
  56. 'referencedColumnName' => $namingStrategy->referenceColumnName(),
  57. 'onDelete' => 'CASCADE',
  58. 'onUpdate' => 'CASCADE',
  59. ),
  60. )
  61. )
  62. ));
  63. }
  64. }