CLI – CronPresenter na Nette v3.1.4
- kralik
- Člen | 230
Ahoj,
je možné rozjet CronPresenter (CLI) na Nette v3.1.4, které parádně frčelo
na Nette 2.1?
RouterFactory.php Nette 2.1
class RouterFactory
{
private $container;
public function __construct(Nette\DI\Container $container) {
$this->container = $container;
}
/**
* @return \Nette\Application\IRouter
*/
public function createRouter()
{
$router = new RouteList();
if ($this->container->parameters['consoleMode']) {
$router[] = new CliRouter(array('action' => 'Cron:cron'));
} else {
$router[] = new Route('<presenter>/<action>[/<id>]', array(
'presenter' => 'Home',
'action' => 'default'
));
}
return $router;
}
}
CronPresenter.php
...
public function actionCron() {
echo 'FUNGUJU!';
$this->terminate();
}
Command pro zavolání cronu
php index.php Cron:cron
Snažil jsem se o to, ale bohužel dostávám chybu týkající se bootstrapu a tohoto $this->container
Using $this when not in object context
Používání CronPresenteru bylo jednodušší než např. kdyby\console
Moc díky
- kralik
- Člen | 230
Felix napsal(a):
Ukazes jeste jak vypada tvuj neon soubor?
Neon soubory
common.neon
parameters:
application:
errorPresenter: Error
mapping:
*: App\*Module\Presenters\*Presenter
session:
expiration: 14 days
# debugger: true
# autoStart: 'always'
di:
export:
parameters: no
tags: no
services.neon
services:
nette.userStorage:
setup:
- setNamespace('bozp-se')
- App\Router\RouterFactory::createRouter
mainModel: App\Model\Main
urazModel: App\Model\Uraz
bubakModel: App\Model\Bubak
auditModel: App\Model\Audit
standardModel: App\Model\Standard
spravaModel: App\Model\Sprava
statsModel: App\Model\Stats
apiModel: App\Model\Api
authenticator: UserAuthenticator
- PosliMailFactory()
moc díky
- Felix
- Nette Core | 1197
Problem je na radku.
App\Router\RouterFactory::createRouter
Zkus to udelat takto.
- routerFactory: App\Router\RouterFactory
- router: @routerFactory::createRouter
Pripadne udelat metodu createRouter statickou a predat container jako parametr do ni.
Oboje by melo fungovat.
- kralik
- Člen | 230
Felix napsal(a):
Problem je na radku.
App\Router\RouterFactory::createRouter
Zkus to udelat takto.
- routerFactory: App\Router\RouterFactory - router: @routerFactory::createRouter
Pripadne udelat metodu createRouter statickou a predat container jako parametr do ni.
Oboje by melo fungovat.
Změnil jsem services.neon takto:
services:
nette.userStorage:
setup:
- setNamespace('bozp-se')
- routerFactory: App\Router\RouterFactory
- router: @routerFactory::createRouter
mainModel: App\Model\Main
urazModel: App\Model\Uraz
bubakModel: App\Model\Bubak
auditModel: App\Model\Audit
standardModel: App\Model\Standard
spravaModel: App\Model\Sprava
statsModel: App\Model\Stats
apiModel: App\Model\Api
authenticator: UserAuthenticator
- PosliMailFactory()
Nyní chyba:
Unexpected item 'services › 0 › routerFactory'
- Marek Bartoš
- Nette Blogger | 1264
Takto je to správně. Tím že jsi tam měl pomlčku jsi měl generovaný, numerický název služby a routerFactory byla položka pole, namísto názvu.
routerFactory: App\Router\RouterFactory
router: @routerFactory::createRouter
- kralik
- Člen | 230
Marek Bartoš napsal(a):
Takto je to správně. Tím že jsi tam měl pomlčku jsi měl generovaný, numerický název služby a routerFactory byla položka pole, namísto názvu.
routerFactory: App\Router\RouterFactory router: @routerFactory::createRouter
super teď to funguje.
Jak prosím mohu zavést „CronPresenter“ v Bootstrap.php?
Bohužel nevím zda to jde v Nette 3.1.4 stejně jako v Nette 2.1.
Bootstrap.php
public static function createRouter(\Nette\DI\Container $container): RouteList
{
$router = new RouteList;
//bdump($container->parameters,'pars');
if ($this->container->parameters['consoleMode']) {
//$application->allowedMethods = FALSE;
$router[] = new CliRouter(array('action' => 'Cron:cron'));
} else {
$router->addRoute('<presenter>/<action>[/<id>]', 'Home:default');
}
$router->addRoute('<presenter>/<action>[/<id>]', 'Home:default');
return $router;
}
Nyní mám chybu:
Error
Using $this when not in object context
Problém zde: if ($this->container->parameters[‚consoleMode‘]) {
Moc díky
- kralik
- Člen | 230
ViPErCZ napsal(a):
pouzij ten container co je v parametru te metody createRouter … ne ten pres $this ;-)
myslíš takto:
if ($container->parameters['consoleMode']) {
Už $container->parameters je prázdné pole.
To dostanu chybu:
Undefined index: consoleMode
Editoval kralik (1. 7. 2022 14:23)
- Marek Bartoš
- Nette Blogger | 1264
Tohle nastavení ti maže parametry z vygenerovaného containeru a jsou dostupné jen při kompilaci
di:
export:
parameters: no
Buď jej odstraň/změn na true, nebo uprav kód tak, abys container zbytečně nepoužíval:
router: @routerFactory::createRouter(%consoleMode%)
public static function createRouter(bool $consoleMode): RouteList
- kralik
- Člen | 230
Marek Bartoš napsal(a):
Tohle nastavení ti maže parametry z vygenerovaného containeru a jsou dostupné jen při kompilaci
di: export: parameters: no
Buď jej odstraň/změn na true, nebo uprav kód tak, abys container zbytečně nepoužíval:
router: @routerFactory::createRouter(%consoleMode%)
public static function createRouter(bool $consoleMode): RouteList
super, toto funguje skvěle.
Mooc díky