ݺߣ

ݺߣShare a Scribd company logo
Jak přemigrovat Slevomat
na Doctrine
za jedno dopoledne
Josef Kříž / @pepakriz
firemní “ORM”
~200 entit
dibi
repozitáře s fluent dotazy
vlastní řešení “second level cache”
master a slave
$user = $em->create(User::class);
$user->create(...);
$user->save(); // fuj
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);
});
}
$ composer require kdyby/doctrine
8:00
Co budeme řešit?
propojení starého řešení na nové
společné připojení do DB
speciální datové typy
identity mapa
cache entit
8:10
Přepsat vše naráz?
8:15
Problém č. 1
200 entit? Ughh
8:20
Přepsat vše naráz?
8:30
Dvě ORM paralelně?
8:40
Problém č. 1
Asociace
$products = $productRepository
->createQueryBuilder('p')
->join('p.comments', 'c')
->where('c.author = 1')
->getQuery()
->getResult();
9:00
Dvě ORM paralelně?
9:10
Jedno ORM
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
9:15
Problém č. 1
Mapping
public static function getColumnMap()
{
static $map = [
'user' => [
'id' => 'id',
'email' => 'email',
],
];
return $map;
}
public static function getTypeMap()
{
static $map = [
'id' => '%i',
'email' => '%s',
];
return $map;
}
public static function getEntityMap()
{
static $map = [
'city' => 'cityId',
];
return $map;
}
public static function loadMetadata(ClassMetadata $metadata)
{
}
10:05
Problém č. 1
Mapping
10:10
Problém č. 2
Vlastní datové typy
10:15
DoctrineDBalTypesType
10:22
doctrine:
master:
types:
- SlevomatDoctrineTypeDateType
...
10:30
Problém č. 2
Vlastní datové typy
10:35
Problém č. 3
Transakce
KdybyDibiBridgeDibiExtension
10:40
10:42
Problém č. 3
Transakce
10:45
Problém č. 4
Starý EntityManager
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);
10:51
Problém č. 5
Identity map
11:01
Problém č. 6
Vlastní “second level cache”
11:39
Problém č. 4
Starý EntityManager
11:48
Problém č. 7
Asociace ze starých
entit do nových
$carts = CartList::getByUser($customer);
//$carts = $carts->filterCanceled(false);
$carts->deleteFromCache();
11:59
Problém č. 7
Asociace ze starých
entit do nových
11:59
Hotovo
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
Dotazy?
Josef Kříž / @pepakriz

More Related Content

Jak přemigrovat Slevomat na Doctrine za jedno dopoledne