Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Jak přemigrovat Slevomat na Doctrine za jedno dopoledne

836 views

Published on

Rady, tipy a zkušenosti, které jsem nasbíral při migraci velkého projektu na Doctrine ORM. Ukážeme si, že přechod nemusí nutně znamenat přepis celé aplikace.

Published in: Software
  • Be the first to comment

  • Be the first to like this

Jak přemigrovat Slevomat na Doctrine za jedno dopoledne

  1. 1. Jak přemigrovat Slevomat na Doctrine za jedno dopoledne Josef Kříž / @pepakriz
  2. 2. firemní “ORM” ~200 entit dibi repozitáře s fluent dotazy vlastní řešení “second level cache” master a slave
  3. 3. $user = $em->create(User::class); $user->create(...); $user->save(); // fuj
  4. 4. public function getFoo() { return $this->databaseConnection ->select('*') ->from('foo') ->where('bar IS NULL') ->setupResult('setRowFactory' , function (array $row) { return $this->em->getByDatabaseData (Foo::class, $row); }); }
  5. 5. $ composer require kdyby/doctrine 8:00
  6. 6. Co budeme řešit?
  7. 7. propojení starého řešení na nové společné připojení do DB speciální datové typy identity mapa cache entit
  8. 8. 8:10 Přepsat vše naráz?
  9. 9. 8:15 Problém č. 1 200 entit? Ughh
  10. 10. 8:20 Přepsat vše naráz?
  11. 11. 8:30 Dvě ORM paralelně?
  12. 12. 8:40 Problém č. 1 Asociace
  13. 13. $products = $productRepository ->createQueryBuilder('p') ->join('p.comments', 'c') ->where('c.author = 1') ->getQuery() ->getResult();
  14. 14. 9:00 Dvě ORM paralelně?
  15. 15. 9:10 Jedno ORM
  16. 16. 9:10 Jedno ORM ● Metadata driver pro staré entity ● Společné connection pro ORM a dibi ● Vlastní typy ● Překlad požadavků ze starého ORM
  17. 17. 9:15 Problém č. 1 Mapping
  18. 18. public static function getColumnMap() { static $map = [ 'user' => [ 'id' => 'id', 'email' => 'email', ], ]; return $map; }
  19. 19. public static function getTypeMap() { static $map = [ 'id' => '%i', 'email' => '%s', ]; return $map; }
  20. 20. public static function getEntityMap() { static $map = [ 'city' => 'cityId', ]; return $map; }
  21. 21. public static function loadMetadata(ClassMetadata $metadata) { }
  22. 22. 10:05 Problém č. 1 Mapping
  23. 23. 10:10 Problém č. 2 Vlastní datové typy
  24. 24. 10:15 DoctrineDBalTypesType
  25. 25. 10:22 doctrine: master: types: - SlevomatDoctrineTypeDateType ...
  26. 26. 10:30 Problém č. 2 Vlastní datové typy
  27. 27. 10:35 Problém č. 3 Transakce
  28. 28. KdybyDibiBridgeDibiExtension 10:40
  29. 29. 10:42 Problém č. 3 Transakce
  30. 30. 10:45 Problém č. 4 Starý EntityManager
  31. 31. function getByPrimary($className, $primaryValue); function getByParams($className, array $params); function getAllByParams($className, array $params); function getByDatabaseData($className, $data,$useCache); function saveEntity(DatabaseEntity $entity); function deleteEntity(DatabaseEntity $entity);
  32. 32. 10:51 Problém č. 5 Identity map
  33. 33. 11:01 Problém č. 6 Vlastní “second level cache”
  34. 34. 11:39 Problém č. 4 Starý EntityManager
  35. 35. 11:48 Problém č. 7 Asociace ze starých entit do nových
  36. 36. $carts = CartList::getByUser($customer); //$carts = $carts->filterCanceled(false); $carts->deleteFromCache();
  37. 37. 11:59 Problém č. 7 Asociace ze starých entit do nových
  38. 38. 11:59 Hotovo
  39. 39. 12:00 Shrnutí ● Metadata driver pro staré entity ● Společné connection pro ORM a dibi ● Vlastní typy ● Překlad požadavků ze starého ORM ● Postupný přechod
  40. 40. Dotazy? Josef Kříž / @pepakriz

×