CliRouter – Velmi divné chování

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

Ahoj,
chtěl jsem si napsat CLI aplikaci v Nette. Tak jsem napsal

$container->router[] = new CliRouter('Menus:main');  // zobrazíme Main menu (MenusPresenter:renderMain)

to mi ale vyhodilo zvláštní chybu, a tak jsem router přepsal do array podoby:

$container->router[] = new CliRouter(array(
    'presenter' => 'menus',
    'action' => 'main',
));

což vyhodilo další zajímavou chybu.

Postupným pitváním Nette jsem nakonec zjistil, že jediný způsob, jak pomocí CliRouteru vůbec spustit presenter, je tento:

$container->router[] = new CliRouter(array(
	'action' => 'menus'  // spustí MenusPresenter::renderMenus()
));

což mi ale přijde opravdu nelogické a zvláštní. Bylo toto chování záměr, nebo je to bug?

Editoval nanuqcz (10. 3. 2012 15:01)

Pipaslot
Člen | 19
+
0
-

Měl jsem stejný problém jako ty. Pokužil jsem stejné řešení jako ty. Definicí action se sice odkazuješ na jeden presenter pomocí definice action ale lze se z příkazové řádky odkazovat i na více actionů tohoto presenteru. Více presenterů jsem nezkoušel, zatím nebylo třeba.

newPOPE
Člen | 648
+
0
-

Tiez som skusal CLI router, dospel som k tomuto:

$container->router[] = new \Nette\Application\Routers\CliRouter(array(
    'action' => 'CommandLine:default',
));

a v konzole mi to fici takto:

php index.php --action=CommandLine:foo

Pravdou je, ze mi to pride ako divne spravanie. Prehladnejsie mi pride

php index.php --presenter=CommandLine --action=foo

Editoval newPOPE (21. 4. 2012 12:19)

nanuqcz
Člen | 822
+
0
-

newPOPE napsal(a):

$container->router[] = new CliRouter(array(
    'action' => 'CommandLine:default',
));

To je super, tohle mě nenapadlo. Díky :-)

Lister
Člen | 12
+
0
-

Tak jsem to taky studoval, situace se mi zkomplikovala, protoze musim mit nakonec pristup i z venku i zevnitr (cli i apache). Kdyz kouknete do CliRouter, tak zjistite, jaka je syntaxe. Pri definici rout staci klasika jako simplerouter (kopiruju z kodu):

<?php
private function createCliRouter()
	{
		$router = new RouteList();
		//default route
		$router = new CliRouter(array('action' => 'Front:Login:default'));
		return $router;
	}
?>

POZOR Je nutne definovat default jako action kvuli PRESENTER_KEY (viz api) vcetne Modulu i presenteru.
Samozrejme default neni povinny, je mozne zadat primo routu jako argument.

Pokud potrebujete predat nejaky argument do funkce (at uz id, nebo cokoliv jineho), je syntaxe argumentu nasledujici:

/id=5

POZOR Lomitko je nutne, CliRouter tak pozna, ze se jedna o argumenty funkce a nikoliv o adresu, jedina vyjimka je tehdy, pokud artgument obsahuje -, pak to pozna taky.

Vysledek je:

php -q index.php Front:SendArticle:default /article=5

coz je odpovidajici k adrese (s rewritem a standardnim routrem):

www.example.cz/send-article/?article=5

nebo link:

<?php
$this->link('Front:SendArticle:default', array('article' => 5));
?>

Doufam, ze to nekomu pomuze