Nette v konzoli aneb integrace Symfony/Console – Kdyby/Console
- Filip Procházka
- Moderator | 4668
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
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.
- darthcz
- Člen | 113
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
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
@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.
- leninzprahy
- Člen | 150
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
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
@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
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
Další otázky prosím zakládejte jako samostatná témata na novém fóru help.kdyby.org. Díky!
- Filip Procházka
- Moderator | 4668
@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.
- piskotek
- Člen | 35
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
@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)