Contributte Console – command z presenteru

Danny
Člen | 146
+
0
-

Zdravím,
používám https://contributte.org/…console.html a potřeboval bych poradit jak pustit Command z presenteru.

Takto vypadá command

final class ParseData extends Command {

	protected function configure(): void
	{
		$this->setName('app:parseData');
	}

	public function execute(InputInterface $input, OutputInterface $output) {
		...zpracovani
	}
}

Takto je zaregistrovaný

services:
	commands.parseData:
		class: App\Model\Console\ParseData
		tags: [console.command: app:parseData]

Pokud ho zavolám v konzoli přes app:parseData tak funguje. Z presenteru jsem to zkoušel takto ale hláší mi to že musí mít Symfony\Component\Console\Application zaregistrovaný v configu, když ho tam přidám tak to háže chybu

There are no commands defined in the "app" namespace

Když si dumpnu ten application tak v tom nejsou vůbec žádné commandy, poradí někdo? Moc děkuji!

Takto vypadá ten presenter

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\ConsoleOutput;

class ApiPresenter
{
	/** @var Application @inject */
	public $application;

	public function actionDefault($hash)
	{
		$input = new ArrayInput(['name' => 'app:parseData']);
		$output = new ConsoleOutput();
		$this->application->doRun($input, $output);
		$this->terminate();
	}
}
nightfish
Člen | 468
+
+6
-

Správné řešení je logiku z commandu vyextrahovat do samostatné služby, kterou budeš pak volat z commandu i z presenteru.

Marek Bartoš
Nette Blogger | 1146
+
-1
-

contributte/console se vůbec neregistruje mimo cli mód. Můžeš jí sice nastavit, aby byla v cli módu vždy, ale rozbije ti to http komunikaci.

To co chceš umožňuje orisai/nette-console. Ale obecně vzato je špatný postup míchat dohromady presentery/controllery/commandy. Měly by mít společný zdroj dat a nepoužívat se navzájem.

Danny
Člen | 146
+
0
-

Jde mi o to že ten command běží celkem dlouho a pokud to vyextrahuju a udělám samostatnou službu a budu to pouštět z presenteru tak se to už nebude pouštět jako CLI ale jako http komunikaci a v tu chvíli mi to zasekne web. Chápu to tak správně? Respektive jsem to zkoušel ale tím že se zpracovával ten command tak jsem nemohl cokoliv jiného načíst.

nightfish
Člen | 468
+
+3
-

@Danny To, co popisuješ, mi zní jako problém se zamykáním session. V zásadě jde o to, že když uděláš dva delší požadavky na svůj web z jednoho prohlížeče, tak se neprovedou současně, nýbrž po sobě – druhý čeká, než první doběhne (a uzavře session) – protože session je uzamčená pro výlučný přístup.

Pokud nepotřebuješ pracovat se session v rámci služby, do které vyextrahuješ command, ani presenter, ve kterém tuto službu voláš, tak by řešením mohlo být zavolání $session->close() před spuštěním služby (dokumentace).

Druhou možností je pokusit se zjistit, proč se ti session v daném presenteru spouští a jestli je to nezbytné.

Felix
Nette Core | 1183
+
0
-

Console imho nepatri do Presenteru. Nedelal bych to.

Petr Parolek
Člen | 455
+
-2
-
<?php

namespace App\Presenters;

use App\Commands\SomeCommand;
use Nette\Application\Responses\TextResponse;
use Nette\DI\Attributes\Inject;
use Nette\DI\Container;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\BufferedOutput;

final class CommandsPresenter extends BasePresenter
{

	#[Inject]
	public Container $container;

	public function actionFoo(): void
	{
		$command = $this->container->getByType(SomeCommand::class);
		$input = new ArrayInput([]);
		$output = new BufferedOutput();
		$command->run($input, $output);

		$this->sendResponse(new TextResponse(trim($output->fetch())));
	}
}
?>

Editoval Petr Parolek (12. 1. 2023 19:40)

Danny
Člen | 146
+
0
-

Děkuji všem moc za super příspěvky a připomínky.

@nightfish tobě děkuji za vyřešení problému s kterým jsme si nevěděl rady a to je uzavření té session.

@PetrParolek tobě děkuji za super funkční řešení jak ten command pustit z presenteru

Každopádně navrhnu takové řešení abych nemusel command volat z presentru ale volal z commandu z presentru nějakou službu která to má řešit.

Petr Parolek
Člen | 455
+
0
-

Nechápu ty palce dolů, dokonce to mají kluci v Symfony v dokumentaci https://symfony.com/…troller.html o volání commandu z kontroleru (tj. v terminologii Nette presenteru)!

Editoval Petr Parolek (13. 1. 2023 21:59)

Petr Parolek
Člen | 455
+
0
-

nightfish napsal(a):

Správné řešení je logiku z commandu vyextrahovat do samostatné služby, kterou budeš pak volat z commandu i z presenteru.

To bych byl zvědavý, jak by někdo vykopíroval kod např. z doctrine/migrations: https://github.com/…eCommand.php

Editoval Petr Parolek (13. 1. 2023 22:05)