Spouštění z příkazového řádku vs spouštění skrz webový server

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

Nemyslíte, že už přišel ten čas, kdy by bylo dobré trochu lépe do Nette zadrátovat podporu pro spouštění jak skrz webový server, tak příkazovou řádku? Vím, že tu už je CliRouter, ale ten neřeší vše. Co by bylo potřeba udělat, je rozdělit nějak presentery na presentery, které obsluhují požadavky, které přišly skrz webový server, a presentery, které obsluhují požadavky, které přišly z příkazové řádky.

Současný stav, kdy si pomocí CliRouter vlastně můžu zavolat všechno, co bych normálně mohl z webu, není IMHO vhodný, protože to ve většině případů není to, co potřebuju. Raději bych nějaké striktnější omezení a rozdělení. Pokud mám takovou typickou asynchronní aplikaci, která se stará o rozesílání nějakých newsletterů, tak skrz web si uživatelé naklikají text newsletteru, zadají všechny příjemce (třeba v nějakém CSV) a nechají zpracovat. Proběhne vytvoření těch e-mailů, ale aby nedošlo ke zbytečnému vytížění linky serveru, jen se ty e-maily uloží nějak do databáze. Občas se potom spustí skrz cron jiná část stejné aplikace, která si z databáze postupně ty e-maily bere a v nějakých smysluplných intervalech je odesílá.

Když dneska použiju CliRouter, budu v takové aplikaci muset mít jak presentery, které řeší web, tak presentery, které řeší příkazovou řádku. To, že je tam musím mít, není zas takový problém. Co je problém, je, že musím vlastně u všech požadavků rozlišovat, jestli přišly z webu, nebo z příkazové řádky, protože venku z webu nikomu nechci dovolit volat ten presenter a akci, která se stará o odesílání těch e-mailů, zároveň mi je ale k ničemu, abych mohl z příkazové řádky používat ty presentery a akce, které je vhodné používat jen z webu.

Zatím vidím následující řešení:

  1. Vložit do hierarchie tříd něco jako CliPresenter a WebPresenter a pracovat s nimi.
  2. Přidat proměnné do třídy Presenter, kterými by se určovalo, jestli daný presenter může být kontaktován skrze web nebo příkazovou řádku ($allowWebAccess a $allowCliAccess).
  3. Udělat speciální anotace, kterými budu moc použití jako Cli a Web určit. Ty anotace by se vlastně daly použít i pro odlišení jednotlivých akcí/pohledů.

Editoval Petr Motejlek (29. 5. 2010 0:54)

Honza Kuchař
Člen | 1661
+
0
-

Pokud, tak to 3), používám podobný princip u modelů, které jsou dostupné jako RPC, zatím se to osvědčilo.

Petr Motejlek
Člen | 293
+
0
-

Mě se ta trojka taky zatím nejvíc líbí ;).

Patrik Votoček
Člen | 2221
+
0
-

Petr Motejlek napsal(a):

  1. Vložit do hierarchie tříd něco jako CliPresenter a WebPresenter a pracovat s nimi.

Nic ti nebrání neco takového udělat.

  1. Přidat proměnné do třídy Presenter, kterými by se určovalo, jestli daný presenter může být kontaktován skrze web nebo příkazovou řádku ($allowWebAccess a $allowCliAccess).

Tohle se mě vůbec nelíbí.

  1. Udělat speciální anotace, kterými budu moc použití jako Cli a Web určit. Ty anotace by se vlastně daly použít i pro odlišení jednotlivých akcí/pohledů.

Tohle vypadá jako nejvíc cool ale jaký by byl výchozí stav? (tj. pokud není žádná anotace přítomna)

Jinak mě vyhovuje aktuální stav. Protože jsem rád že můžu některé věci pouštět i z prohlížeče (mam nějákej cron parser a chci ho mimořádně spustit). Jediné na co jsem přímo v Nette nenašel a scházelo mě bylo $this->isCli() (něco jakko $this->isAjax()) v presenteru tak jsem si to dopsal do svého base presenteru.

protected function isCli()
{
	return defined('STDIN');
}
Ondřej Mirtes
Člen | 1536
+
0
-
protected function isCli()
{
	return Environment::isConsole();
}

?

Patrik Votoček
Člen | 2221
+
0
-

taková „hezčí“ varianta… :-p

Petr Motejlek
Člen | 293
+
0
-

Kdybychom se bavili o řešení s anotacemi, tak bych jako výchozí stav bral, že není povolené spouštět daný presenter/akci ani přes web ani přes příkazovou řádku. Zkusím to promyslet a při dostatku času i něco, co by s těma anotacema pracovalo, vytvořím. Nejspíš trochu znásilním stávající routery :D.