Modul pro Cron – CLI – probém s routou

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

Zdravím a prosím o radu.

Snažím se udělat modul pro Cron přes CLI router:

<?php

namespace App\IkonisModule\Routing;

use Nette\Application\Routers\Route;
use Nette\Application\Routers\RouteList;


final class RouterFactory {

    private $container;

    public function __construct(\Nette\DI\Container $container) {
        $this->container = $container;
    }

    /**
     * @return \Nette\Application\IRouter
     */
    public function create() {
	$router = new RouteList;

	if ($this->container->parameters['consoleMode']) {
	    $router[] = new \Nette\Application\Routers\CliRouter(array(
		'module' => 'Cli',
		'presenter' => 'Cli',
		'action' => 'cron'
	    ));
	} else {

	    $router[] = new Route('<presenter>/<action>[/<id>]', array(
		'module' => 'Ikonis',
		'presenter' => 'Login',
		'action' => 'default'
	    ));
	}
	return $router;
    }

}

Strukturu mam

app\CliModule
	-presenters
		-BasePreseter
		-CliPresenter
app\IkonisModule
	-presenters
		-...

BasePresenter:

<?php

namespace CliModule;

use Nette;

abstract class BasePresenter extends Nette\Application\UI\Presenter {

    public function startup() {
        parent::startup();
        if (!$this->context->parameters['consoleMode']) {
            throw new \Nette\Security\AuthenticationException;
        }
    }

}

a CliPresenter:

<?php

namespace CliModule;


class CliPresenter extends BasePresenter {

    public function actionCron() {
        echo 'FUNGUJU!';
        $this->terminate();
    }

}

Když na řádce zavolám
php index.php Cli:Cli:cron tak to funguje
pokud jen php index.php tak to hází error 404 ..

Pokud do toho routeru v té podmínce dam např. default:

$router[] = new \Nette\Application\Routers\CliRouter(array(
		'module' => 'Ikonis',
		'presenter' => 'Login',
		'action' => 'default'
	    ));

Tak to také jede.. problém s namespace nebo nevim :/

Netušíte, kde může být problém?
Díky!

Jan Mikeš
Člen | 771
+
0
-

Ahoj, sice to neresi tvuj konkretni problem, ale velice doporucuji vyuzit Kdyby\Console s cimz ti odpadnou uplne starosti o router, presentery, nepekne sahani na $this->context v presenteru atd..

Secteno podtrzeno, zbavis se chyby, se kterou se setkavas a navic k tomu vyuzijes skvelou a udrzovanou knihovnu a moderni pristup ;).

MW
Člen | 626
+
0
-

Tak jsem na to prisel:

$router[] = new \Nette\Application\Routers\CliRouter(array('action' => 'Cli:Cli:cron'));

Diky!

Editoval MW (19. 5. 2016 12:05)

MW
Člen | 626
+
0
-

Ted bych jen prosil ještě o jednu radu.

Jak z toho CLI modulu zavolám nějakou metodu v jinem presenteru v modulu IKONIS.
Mám tam celkem složité procesy a nechce se mě to kopírovat nebo řešit přes statické metody.

Lze to nějak, prosím?

Díky!

Jan Mikeš
Člen | 771
+
+2
-

Presun tuto logiku do samostatne tridy, kterou si zaregistruj jako service a tu nasledne injectuj do presenteru kde potrebujes danou akci provest.

MW
Člen | 626
+
0
-

Toho jsem se bal :)
Ale mas pravdu.. je to nejlepší reseni.. moc diky!