Překlad vyjímekv Nette\Database
- marau
- Člen | 50
Zdravím forum,
napdl mě jeden takový zlepšovák do Nette/Database. U každého projektu si nad db stavím překladač výjímek, které vyhazuje PDO. Například pro chybu 23000 si vždy píšu svou vlastní DupValOnIndexException, které pak předávám podrobnější informace o chybě.
Místo:
try {
$pdo->query('...');
}
catch (\PDOException $e) {
if ($e->getCode() == 23000) {
//code
}
}
Píšu:
try {
$pdo->query('...');
}
catch (DupValOnIndexException $e) {
dump($e->getIndex()); //url
dump($e->getIndex()); //[url, is_visible] - pokud je index na více sloupcích
dum($e->getPrimary()); //7 - hodnta primárního klíče
//code
}
catch (\PDOException $e) {
//code
}
Mám tak ihned informaci o názvu indexu, který neprošel (výhodné pokud je v tabulce více unkátních indexů), hodnotě primárního klíče na záznamu atd … . Otevírám proto diskuzi o této vyjímce, případně o dalších kódech, které by bylo dobré překládat na separátní výjímky.
Editoval marau (29. 9. 2014 19:41)
- Jan Tvrdík
- Nette guru | 2595
Prosím prosím, pošleš pull request? Taky už mě nebaví to na každém projektu psát znova.
- Filip Procházka
- Moderator | 4668
V doctrine/dbal už je mají pěkně rozepsané, takže bych doporučil inspirovat se tady
- marau
- Člen | 50
Já se to tam klidně pokusím doplnit, jen mi dejte trochu čas, s novým nette a nette/database se zatím seznamuju a chci to zkusit využít na menší projekty, na kterých mi zase až tak nejde o čistotu ale spíš o rychlost vývoje.
Jinak jaké jsou konkrétně nápady na implementaci do Nette/database? Na kolika místech se vyhazují PDO Exceptiony, pár míst jsem našel ale nejsem si jist, zda je to vše. V nette/database asi neexistuje žádné jedno místo, přes které by proudily všechny sql dotazy, nebo ano? Našel jsem query v Connection ale to je označeno jako @deprecated, tak nevím. Jak jsem říkal, dejte mi chvilku na seznámení :)
Jaké výjímky tedy budeme implementovat? Vememe stejný způsob jako má doctrine? O vyhazování konkrétních vyjímek by se měl asi postarat driver.
- Jan Tvrdík
- Nette guru | 2595
Tady
tu obecnou PDOException zachytíš a pak
$this->connection->getSupplementalDriver()
požádáš, aby
ji pokud možné překonvertoval na nějakou specifickou.