Nette\Database – změna accessoru Connection::$driver

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
dcepelik
Člen | 36
+
0
-

Zdravím vás,

stavím nad Nette\Database vlastní vrstvu a narážím na následující problém: v konstruktoru potomka potřebuji nastavit používaný driver, tzn. přiřadit do proměnné Nette\Database\Connection::$driver – ta je však privátní.

Napadá mě několik řešení, ale ani jedno vhodné:

  • zkopírovat kód třídy a ve „vlastní“ implementaci upravit chování,
  • zasáhnout přímo do kódu Nette,
  • komponovat Nette\Database\Connection a postavit tak nad ní cosi jako Adapter.

Poslední jmenované řešení je sice „čisté“, ale poněkud složité pro to, čeho se snažím dosáhnout.

Bylo by možné nastavit accessor Nette\Database\Connection::$driver na protected?

Přeji pěkný den,

David Čepelík

Editoval dcepelik (29. 6. 2011 20:08)

redhead
Člen | 1313
+
0
-

A proč ho nenastavíš přes konstruktor Connection samotné?

https://api.nette.org/…ion.php.html#50

dcepelik
Člen | 36
+
0
-

redhead napsal(a):

A proč ho nenastavíš přes konstruktor Connection samotné?

https://api.nette.org/…ion.php.html#50

Pokud myslíš jako součást DSN, tak proto, že mi nejde o název driveru (např. mysql), ale o třídu, která slouží jako driver (např. Nette\Database\Drivers\MySqlDriver). Tu není možné změnit, přestože to může být žádoucí, chci-li používat vlastní driver. (Možná je to trochu atypické, ale budiž.) Její název se skládá v konstruktoru (lok. $class)

Měl jsem se vyjádřit jasněji. Pokud jsi poukazoval na něco jiného, můžeš to, prosím, upřesnit?

Editoval dcepelik (29. 6. 2011 22:11)

redhead
Člen | 1313
+
0
-

Ano, myslel jsem jméno driveru. Neuvědomil jsem si, co chceš, sry.

Nicméně mi stále trochu uniká důvod. Pokud chceš používat vlastní driver, prostě uděláš třídu a uvedením správného DSN inicializuješ.

Editoval redhead (29. 6. 2011 22:35)

dcepelik
Člen | 36
+
0
-

Jde mi o to, že ať zadám jakýkoli název driveru, $class se nastaví na:

<?php

	$class = 'Nette\Database\Drivers\\' . $this->getAttribute(PDO::ATTR_DRIVER_NAME) . 'Driver';

?>

A jsem v koncích – ve jmenném prostoru Nette\Database\Drivers jsou už všechny názvy obsazené a jiné použít nemohu. Zkoušel jsem do příslušené části DSN zapsat název vlastního driveru, např. „ExtendedMySql“, nicméně to musí, pochopitelně, selhat. Název driveru slouží primárně vlastnímu PDO, to, že jej využívá Nette\Database, je z hlediska návrhu vedlejší, což jsem si zprvu neuvědomil.

Tedy proto.

PS: pokud si stále nerozumíme, mohl bys uvést příklad?

Editoval dcepelik (29. 6. 2011 23:11)

David Grudl
Nette Core | 8107
+
0
-

Jak to nastavovat? Třeba přes 3. parameter $options?

dcepelik
Člen | 36
+
0
-

David Grudl napsal(a):

Jak to nastavovat? Třeba přes 3. parameter $options?

Ano, to by šlo, díky!

Omlouvám se za zpožděnou reakci, nedostal jsem se dříve k počítači.

EDIT: Teď mě ještě napadá, že $options jsou čtvrtý parametr – mluvíme o téže věci?

Editoval dcepelik (4. 7. 2011 13:22)

David Grudl
Nette Core | 8107
+
0
-

fixed