DiscoveredReflection a view

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

Mám jednu databázi a dvě aplikace které s ní pracují. Ta druhá potřebuje kromě jiného tabulku uživatelů (kvůli přihlašování) a navíc ji ještě nesmí vidět celou. Vyřešil jsem to tím, že jsem si vytvořil VIEW na tuto tabulku a druhá aplikace dostala práva pouze k tomu VIEW a k původní tabulce nikoli.

Nyní ale nastává problém. Používám discovered reflexi, která ale na tom view nedokáže identifikovat primární klíč (kde by se taky vzal – sloupec id tam sice je, ale to je jen konvence). Konkrétně to spadne na $row->toArray() v authenticatoru když předávám řádek do identity.

Co s tím? (Pozn. ConventionalReflection není řešení, konvence nejsou vždy dodrženy takže je třeba DiscoveredReflection.)

hrach
Člen | 1838
+
0
-

Reseni je celkem easy. Podedit si DiscoveredReflection a prekryt vsechny metody, s tim, ze pokud bude $table === 'tvoje_view', tak posles do parenta call se zdrojovou tabulkou.

Editoval hrach (15. 2. 2013 11:23)

enumag
Člen | 2118
+
0
-

Tak jistě, ale to je jen řešení konkrétního případu, ne obecné. ;-)

hrach
Člen | 1838
+
0
-

Co ti brani si to naprogramovat obecne?

enumag
Člen | 2118
+
0
-

Pouze lenost a relativní složitost obecného řešení. :-D Jednak je potřeba detekce co je view a co ne, což se dá vytáhnout z driveru, ale muselo by se to cachovat aby se pořád nevolalo SHOW TABLES. Potom bych z toho view potřeboval vytáhnout tu parent tabulku což nevím jestli lze. Pokud ne, musela by ta reflexe vyžadovat ještě nějakou konfiguraci navíc.

Zatím nějak přežívám bez views, ten jeden případ jsem tehdy vyřešil v podstatě způsobem který jsi popsal. Třeba se dokopu k řešení až na to zase narazím. ;-)

hrach
Člen | 1838
+
0
-

Dle me je plne korektni a postacuji manualni defice pole, na cem view muze zaviset.

$reflection = new Discovered2Reflection;
$reflection->addViewReference('view', 'table');
$reflection->addViewReference('view', 'table_next');

S tim, ze by bylo treba odchytavat v cyklu asi vyjimku, kdyz by bylo pro jeden view vice reseni. To by slo vyresit tim, ze zrefactorujeme reflection, ktere bude nove vracet jen null. To by slo pekne vyresit v souvislosti s timto.

hrach
Člen | 1838
+
0
-

(Vyjimky jsou zbytecna rezie navic v tomto pripade, je treba dosahnout rychlosti, navic bychom se priblizili k mozne implementaci reflection chainu)

enumag
Člen | 2118
+
0
-

Vyhazoval bych něco jako InvalidArgumentException už při volání addViewReference pokud by view již existovalo.

U odkazované issue 778 stačí jen vyhodit jiný typ než PDOException s lepší msg, ne?

U reflection chainu jsou výjimky imho nežádoucí režie.

hrach
Člen | 1838
+
0
-

To s tim Invalid…, nevim na co reagujes, ale asi si nepochopoil ten problem :D

Add 778, jde tez o neco jineho, a to zde: https://github.com/…ctiveRow.php#L292, se to ma catchnout a vyhodin MemberAccessException.

enumag
Člen | 2118
+
0
-

Fajn. :-D Nechávám na tobě. :-P