Contributte Console – command z presenteru
- Danny
- Člen | 146
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();
}
}
- Marek Bartoš
- Nette Blogger | 1280
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
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 | 519
@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é.
- Petr Parolek
- Člen | 455
<?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
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
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
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)