Otestujte Lean Mapper 4
Lean Mapper 4 je za dveřmi, pojďte ho otestovat.
Poslední vydanou verzí byl Lean Mapper 3.4.2 vydaný v dubnu 2020. Dnes si ukážeme co přináší chystaný Lean Mapper 4.
Podpora Dibi 4 a PHP 7.1+
Dlouho očekávaná změna - Lean Mapper nyní vyžaduje Dibi 4 a PHP 7.1 nebo novější. Zároveň by měl být Lean Mapper plně kompatibilní s PHP 8.0.
S tím souvisí největší BC break této verze - všechny metody a funkce nyní obsahují nativní typehinty, které přineslo PHP 7.1. Taky používáme striktní typování (tj. všechny soubory obsahují declare(strict_types=1)).
Pokud tedy používáte např. vlastní mapper, budete muset doplnit typehinty k parametrům, aby byl mapper kompatibilní s rozhraním LeanMapper\IMapper.
Konverze hodnot z databáze
Hlavní novinka této verze. Pokud chcete, máte nyní možnost upravit hodnoty, které přicházejí z databáze předtím než se předají do entity (včetně zpětné konverze ve směru entita => databáze).
Otevírá to cestu k různým konverzím hodnot (string na DateTime) nebo nativnímu použití value objektů (můžeme např. snadno převést emailovou adresu uloženou v databázi na objekt EmailAddress). Dříve to šlo realizovat jen pomocí vlastního getteru nebo příznaku m:passThru, což nebylo příliš efektivní.
Konverze se realizuje v mapperu pomocí nově přidaných metod convertToRowData (databáze => entita) a convertFromRowData (entita => databáze):
/**
* @property int $id
* @property EmailAddress $email
*/
class Author extends LeanMapper\Entity
{
}
class MyMapper extends LeanMapper\DefaultMapper
{
public function convertToRowData(string $table, array $values): array
{
if ($table === 'author') {
$values['email'] = new EmailAddress($values['email']);
}
return $values;
}
public function convertFromRowData(string $table, array $data): array
{
if ($table === 'author' && array_key_exists('email', $data)) {
$data['email'] = $data['email']->getValue();
}
return $data;
}
}
V metodě convertFromRowData() je nutné kontrolovat, jestli $data opravdu obsahují konkrétní hodnotu (v tomto případě email). Lean Mapper totiž persistuje pouze změněné hodnoty, takže i metoda convertFromRowData() obdrží na vstupu pouze změněná data.
Pozor! Tato funkce má zatím jedno omezení - nelze tímto způsobem převádět primární klíče, ty stále musí mít skalární hodnotu (int|string). Pokud se to ukáže jako zásadní omezení, bude podpora pro primární klíče doplněna v jednom z příštích vydání.
Ostatní změny
Jednou ze zbývajících změn je, že se výchozí namespace entit ($defaultEntityNamespace) v LeanMapper\DefaultMapper nyní nastavuje pomocí konstruktoru:
$mapper = new LeanMapper\DefaultMapper('App\Entities');
Dřívě bylo nutné podědit DefaultMapper a přepsat property $defaultEntityNamespace.
Další změna se týká LeanMapper\Fluent. Fluent v dřívějších verzích přepisoval statickou proměnnou $masks, aby do Dibi\Fluent doplnil podporu pro UNION. Tato úprava ale nefungovala spolehlivě, takže byla odstraněna a nyní se plně spoléháme na přednastavené chování Dibi.
A v neposlední řadě proběhla drobná úprava ve třídě LeanMapper\Entity, která je díky tomu nyní striktnější při přiřazování hodnot do entity. Dřívě bylo možné přiřadit do položky typu int např. řetězec a Lean Mapper na pozadí provedl konverzi hodnoty na správný typ pomocí settype(). Nyní v takovém případě entita vyhodí vyjímku a přetypování musíte provést sami. Kontrola typu se neprovádí pouze v případě, že položka obsahuje příznak m:passThru a Lean Mapper tak spoléhá, že konverzi nebo kontrolu hodnoty provedete sami.
Opravy chyb
Byly doplněny testy a opraveny některé okrajové případy - např. chyba při volání Result:: cleanReferencing()/cleanReferenced() v kombinaci s používáním FilteringResult. Troufám si tvrdit, že na většinu těchto případů nikdo nikdy nenarazil.
Dále např. Repository při přístupu k neexistující property ($repository->unexists) generovalo nesmyslnou hlášku, nyní v takovém případě vyhazuje vyjímku.
A opravena byla i kompatibilita s nette/di ^3.0 při použití Nette DI extension (třída LeanMapper\Bridges\Nette\DI\LeanMapperExtension).
Změny pod kapotou
Pod kapotou taky došlo k řadě úprav - byl sjednocen coding style, kód je testován pomocí PhpStan (level 7), apod.
Pojďte testovat
Lean Mapper 4 je z mého pohledu připraven k vydání. Před tím než tak učiním vás ale prosím, abyste novou verzi otestovali na svých aplikacích a hlásili problémy, na které narazíte. Pořád je ještě čas některé věci před vydáním nové verze upravit. Mělo by stačit, pokud Composeru řeknete, aby instaloval verzi ^4.0@dev.