Nette v konzoli aneb integrace Symfony/Console – Kdyby/Console

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Filip Procházka
Moderator | 4668
+
+11
-

Zdravím,
Kdyby/Console je doplněk pro Nette, který do něj integruje komponentu Symfony/Console.

Na rozdíl od CliRouteru nepoužívá vůbec presentery, píší se pro ni třídy zvané commandy, které jsou specializované na spouštění z konzole. Registrují se jako služby a přidáváme jim tag kdyby.console.command, aby je compiler našel a správně registroval

services:
    newsletterCommand:
        class: App\Console\SendNewslettersCommand
        tags: [kdyby.console.command]

Po připojení rozšíření se automaticky napojí na router a když je aplikace spuštěna z konzole, pozná to a předá řízení konzolovému Application a okamžitě můžeme začít používat

$ php www/index.php

Dejte sbohem nebezpečným cronům, konzolový příkaz vám ze přes webserver nikdo nespustí!

Samozřejmostí je kompatibilita s Kdyby/Doctrine.

Rozšíření je klasicky na Githubu k vašim službám včetně dokumentace, nejlépe ho instalujte pomocí composeru

Otázky směřujte sem

Další otázky prosím zakládejte jako samostatná témata na novém fóru help.kdyby.org. Díky!

JakubTN
Bronze Partner | 49
+
0
-

Ahoj,

riesim prave nejake crony a presne taketo nieco by sa mi hodilo.

Snazim sa doplnek rozbehat, no ked ho zaregistrujem v bootstrap.php a nastavim v config.neon, dostavam nasledujuci error: http://cl.ly/…3x3v2t2Q043v. Appka bezi na nette 2.0.12.

Skusal som uz vsetko mozne, no nepodarilo sa mi tuto chybu odstranit, vedel by si mi poradit? Dakujem za radu.

mkoubik
Člen | 728
+
0
-

JakubTN napsal(a):

Používáš v nette 2.0 verzi pro nette 2.1-dev. Pokud to neinstaluješ přes composer, tak si stáhni z githubu větev nette-2.0.

JakubTN
Bronze Partner | 49
+
0
-

mkoubik napsal(a):

Používáš v nette 2.0 verzi pro nette 2.1-dev. Pokud to neinstaluješ přes composer, tak si stáhni z githubu větev nette-2.0.

omg ja som blb… jasne, ze to bolo tym. Mam to cez composer, ale mal som tam priradenu zlu verziu :) Dik moc za usmernenie.

darthcz
Člen | 113
+
0
-

nejak se mi nedari tu consoli rozjet – pouzivam na lokalnim apache serveru virtual host a nedari se mi nastavit v configu url tak, aby mi php index.php nevypisoval text indexu s 404…(url: http://mts.local) Pokud kdyby consoli vypnu, tak se mi tento prikaz provede normalne a vypise text index stranky bez 404, takze mi ta console nezere url… Pokud napriklad nezadam v configu url, tak v consoli mam normalne chybu, takze to tu kdyby consoli provadi…

chci z te console provadet kdyby/doctrine prikazy :) Nevite nekdo, jak na to?

Composer:

"php": "~5.4.0"
"nette/nette": "~2.0.0"
"kdyby/doctrine": "~0.1"
<?php
//bootstrap
use Nette\Application\Routers\Route;
use Nette\Application\Routers\RouteList;
use Nette\Config\Configurator;

// Load Nette Framework or autoloader generated by Composer
require_once LIBS_DIR . '/autoload.php';

// Configure application
$configurator = new Configurator;
$configurator->setTempDirectory(__DIR__ . '/../temp');

$productionMode = FALSE;
if (file_exists(__DIR__ . '/.production_mode')) {
	$configurator->setProductionMode(TRUE);
	$productionMode = TRUE;
} else {
	$configurator->setProductionMode(FALSE);
}

// Enable Nette Debugger for error visualisation & logging
$configurator->enableDebugger(__DIR__ . '/../log');

// Enable RobotLoader - this will load all classes automatically
$configurator->createRobotLoader()
	->addDirectory(__DIR__)
	->register();

// Create Dependency Injection container from config.neon file
$configurator->addConfig(__DIR__ . '/config/config.neon', $productionMode ? $configurator::PRODUCTION : $configurator::DEVELOPMENT);

//registration of configurable addons
\Kdyby\BootstrapFormRenderer\DI\RendererExtension::register($configurator);
\Kdyby\Annotations\DI\AnnotationsExtension::register($configurator);
\Kdyby\Console\DI\ConsoleExtension::register($configurator);
\Kdyby\Events\DI\EventsExtension::register($configurator);
\Kdyby\Doctrine\DI\OrmExtension::register($configurator);

$container = $configurator->createContainer();

// Run the application!
$container->application->run();

Editoval darthcz (7. 2. 2014 6:37)

leninzprahy
Člen | 150
+
0
-

Tam je důležité, mít zaregistrovanou službu s tagem kdyby.console.command , např.

service:
	myCommand:
		class: App\MyCommand
		tags: [kdyby.console.command]

viz https://github.com/…/en/index.md

Jinak se mi líbí přístup, že z konzole vůbec nespouštím nette aplikaci, ale jen tu konzolovou.

Pokud použiješ bootstrap.php ze sandboxu (hlavní rozdíl je, že se zde pouze vytváří a vrací DI container, aplikace se spouští až v index.php), stačí si pak napsat třeba console.php který bude obsahovat

<?php

/** @var \Nette\DI\Container */
$container = require_once __DIR__  . '/bootstrap.php';

$application = $container->getByType('Kdyby\Console\Application');

$application->run(
		new \Symfony\Component\Console\Input\ArgvInput,
		new \Symfony\Component\Console\Output\ConsoleOutput);

a po zavolání php ./console.php by mělo všechno fungovat dle očekávání…

Filip Procházka
Moderator | 4668
+
0
-

@leninzprahy špatně! Stačí zaregistrovat extension a v consoli napsat

$ php www/index.php

tedy spustit index php v konzoli – řízení převezme automaticky kdyby/console.

Žádné tyhle vytváření souborů a pouštění jiné application není vůbec potřeba, to všechno si samo řeší console.

Viz http://youtu.be/MJCuT8BMEuE?…

leninzprahy
Člen | 150
+
0
-

Samozřejmě že pouze zaregistrovat extension a o nic se nestarat je jednodušší přístup.

Jen mi přišlo zbytečné spouštět Nette\Application\Application, pomocí routeru přejít na CliPresenter a tam až spouštět Kdyby\Console\Application.

Nebo mi něco uniká, mám tam nějaký nesmysl?

darthcz
Člen | 113
+
0
-

no, pokud to spravne chapu, tak tyhle sluzby s prikazy si kdyby/doctrine zaregistruje samo a melo by jit je normalne pouzivat… tohle spis vypada, ze to bud neumi pracovat s virtual hostem a nebo se tomu nedari predredit se klasickemu routeru, ptz mi to normalne provede soubor index.php, vypise text a v nem je 404…

Driv jsem vyuzival nella/doctrine s nella/console a tam tehle pristup fungoval v pohode, stacilo napsat console: true do configu a jelo se, takze nevidim problem v ostatnim kodu…

Filip Procházka
Moderator | 4668
+
+1
-

@leninzprahy no kdyby to nemělo smysl tak bych to neprogramoval :) Až budeš například chtít posílat emaily nějakým cli příkazem tak ten presenter budeš potřebovat (nebo cokoliv jinýho s odkazy).

@darthcz zaregistruješ extension a pustíš index.php z konzole. Fungovat to nemusí pokud máš vlastní RouteList nebo jakkoliv hackuješ router. Všem těm stovkám lidí co si to nainstalovali to funguje, takže tam nejspíš děláš něco špatně. Smazal jsi cache?

Případně se stav za námi na nette jabber místnost, můžeme to zkusit vyřešit tam.

darthcz
Člen | 113
+
0
-

Tak problém byl skutečně v routelist, který jsem měl definovaný v bootstrapu. Když jsem routy předělal na routefactory, tak vše začalo fungovat. Tenhle přístup routování mi nějak dosud unikal. Nenašel jsem bohužel žádnou dokumentaci ani na https://doc.nette.org/…tion/routing.

Každopádně ještě jednou moc děkuji za pomoc na jabberu :)

Filip Procházka
Moderator | 4668
+
0
-

Další otázky prosím zakládejte jako samostatná témata na novém fóru help.kdyby.org. Díky!

jasin755
Člen | 116
+
0
-

Mám stejný problém. Vyjímka BadRequestException No route for HTTP request. Mám vlastní router, který routuje i na úrovní domén. Jak tomu mám vnutit nějakou URL nebo jak to vlastně obejdu?

Filip Procházka
Moderator | 4668
+
0
-

@jasin755 ten hlavní router, který obaluje všechny ostatní routery, měj jako výchozí RouteList, teprve do něj dávej své routy a bude to fungovat.

galvani
Člen | 1
+
0
-

Pozor na smazani te cache, to byl problem u mne

piskotek
Člen | 35
+
0
-

Ahoj,
snazim se udelat aplikaci na zpracovani feedu od dodavatele.
Konzole se mi povedla rozchodit, na localhostu (win10 / xampp) mi vse funguje, ALE nejak nechapu jak udelam automaticke spousteni (planovac) ktery by mi kazdy den stahoval aktualni data.
Nebo je lepsi misto kdyby/console pouzit kdyby/cronner?

newPOPE
Člen | 648
+
0
-

@piskotek to uz nechaj na CRON ktory je (vacsinou) sucastou Linux-u https://help.ubuntu.com/…ty/CronHowto

Podstata je taka, ze nechas systemom spustit ten command periodicky raz za den napr…

EDIT: vsimol som si ze mas WIN tak tam sa to nastavuje inak napr. http://stackoverflow.com/…b-in-windows

Editoval newPOPE (24. 8. 2016 13:24)

piskotek
Člen | 35
+
0
-

@newPOPE WIN mam na local, jinak mam server s debianem, kde to i pobezi, jen to zatim testuju na localu.

Takze ted uz to je zalezitost OS a ne php/nette/kdyby?
Večer to zkusím, díky za radu

newPOPE
Člen | 648
+
0
-

@piskotek presne tak.