Routování a anotace

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

Zdravím,

napadla mě věc, když už ty anotace budou fungovat i se zapnutým eAcceleratorem, jak bych mohl využít anotace pro přejmenování presenterů a akcí v url pro českou verzi. Vím, že se bude dozajista jednat o vlastní napsání routeru (s routami jsem zatím neexperimentoval, protože mi dosud na localu nešel mod-rewrite). Má představa:

/** @name(lang = 'cs', value = 'uzivatele') */
class UsersPresenter extends Presenter
{
	/** @name(lang = 'cs', value = 'detaily') */
	public function actionDetails() { /* ... */ }
}

a pak by jely url:

http://example.cz/uzivatele/detaily

http://example.cz/en/users/details

Jak byste na to šli? Je to určitě triviální, ale můj mozek jaksi rezignuje o něčem přemýšlet.

Ondřej Mirtes
Člen | 1536
+
0
-

Nepůjde o napsání vlastního routeru. Stačí si vzít seznam presenterů z cache RobotLoaderu (nic systematičtějšího zatím Nette nenabízí), vzít si z jednotlivých jejich anotace a z nich pak vytvořit pole, které předáš do této metody:

Route::setStyleProperty('presenter', Route::FILTER_TABLE, array(
    'prihlasit-se' => 'Login',
    'registrace' => 'Registration',
    'nastaveni' => 'Settings',
));

Mimochodem – je to zajímavý nápad a hodilo by se ho mít přímo ve frameworku :)

redhead
Člen | 1313
+
0
-

Ahááá, tak to je krása (měl jsem to tak do teď, ale array natvrdo napsanej)

Ovšem trochu zrada. Někde sem tu čet jak dostat presentery z kešky RobotLoaderu, ale asi se to od té doby změnilo, a kód nefuguje. Bez změny v RobotLoaderu nemůžu dostat unikatní klíč, pod kterým se cache ukládá. Změna se týká metody RobotLoader::getKey() která je private. A pro získání dat z keš je potřeba ($cache[$key]).

Navíc bude trochu problém s velikostí písmen. RobotLoader totiž všechno ukládá lowercase a překladový slovník je jak jsem zjistil case-sensititive.

Bylo by opravdu hezké, kdyby se do FW dostala nějaká metoda na získání všech presenterů.

redhead
Člen | 1313
+
0
-

co se týče těch velikostí písmen, tak teda zatím mám naštěstí všechny názvy presenterů jednoslovné (DetaultPresenter, UsersPresenter), ale až přijde něco jako FooBarPresenter, tak mám pocit, že tam to skončí..

David Grudl
Nette Core | 8218
+
0
-

Vím, že se to u jiných frameworků používá, ale mám za to, že je to prasárna. Jakákoliv změna routování pak obnáší zasahovat do kódu presenterů, namísto úpravy na jednom nezávislém místě.

redhead
Člen | 1313
+
0
-

Rád bych znova otevřel tohle téma, páč mě tahle záležitost dost zajímá.

Podle DG je to prasárna, tak se ptám, jak to udělat neprasácky. Když to tak vemu nejde ani tak o routování. Routování se může měnit jak chce, ale budu mít zaručeno, že budu znát jméno presenteru v jiném jazyce. Pokud bych potřeboval tohle jméno využít u čehokoliv jiného, tak mi to prasácké nepřijde. To routování je pouze aplikace (využití) těch anotací.

Pokud bych to měl mít bokem někde napsané v poli, je velká šance, že to zapomenu updatovat a bude se to stávat nepřehledným. Ale u anotací presenteru/actiony budu hned vidět, že mi to chybí.

Routování se může měnit, ale názvy presenterů budou stejné (protože pak bych to musel měnit v šablonách – redirectech, lincích, …)

btw: trochu jsem přehodnotil zápis a tenhle bude lepší:

/** @name( cs => 'uzivatele', hu => 'felhasznaloi' ) */

Teď sice používám jiný, ale funguje to hezky, až na pár problémků se změnou jazyka.

Kdo by měl jakýkoliv jiný nápad nebo kdo používá něco podobného jinak, podělte se.