CLI – CronPresenter na Nette v3.1.4

kralik
Člen | 230
+
0
-

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

Felix
Nette Core | 1197
+
0
-

Ukazes jeste jak vypada tvuj neon soubor?

kralik
Člen | 230
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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

Felix
Nette Core | 1197
+
0
-

Problem je v te public static metode. Ta nemuze volat $this.

kralik
Člen | 230
+
0
-

Felix napsal(a):

Problem je v te public static metode. Ta nemuze volat $this.

ano, já vím, ale lze to nějak vyřešit?
Nebo obejít?

Případně zjistit, že se jedná o volání z command line?

Opomenu-li robustní řešení v podobě kdyby\console.

Díky

ViPEr*CZ*
Člen | 817
+
0
-

pouzij ten container co je v parametru te metody createRouter … ne ten pres $this ;-)

kralik
Člen | 230
+
0
-

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
+
+1
-

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
+
0
-

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