Postęp operacji delegowanej do serwisu

0

Witam.

W Symfony chce stworzyć komendę która po wywołaniu uruchomi odpowiednią metodę z serwisu - tam zostaną przeprowadzone wsyzstkie operacje.
Chciałbym aby użytkownik miał pokazywany postęp operacji.

Czyli z metod serwisu muszę mieć dostęp do ProgressBar z komendy.

W sieci znalazłem rozwiązanie polegające na przekazaniu do serwisu callbacku'u który będzie operował na progress bar.
Coś takiego:

// service method
public function update(\Closure $callback = null)
{
    $validCountryCodes = $this->countryRepository->findAll();

    $products = $this->productRepository->findWithInvalidCountryCode($validCountryCodes);

    foreach ($products as $product) {
        if ($callback) {
            $callback($product);
        }
        ...
    }
}

/**
 * command file
 */
public function execute(InputInterface $input, OutputInterface $output)
{
    $progress = new ProgressBar($output, 50);

    $progress->start();

    $callback = function ($product) use ($progress) {
        $progress->advance();
    };
    $this->getContainer()->get('update.product.countries')->update($callback);
}

Problem w tym, że w serwisie operacja jest rozbita na wiele metod.
Pytanie czy jest możliwość (bo nie udaje mi się tego znaleźć w necie), żeby uczynić ten przekazany do metody update callback dostępnym dla wszystkich metod w serwisie?

Mógłbym go przekazywać jako parametr do każdej uruchamianej metody, ale nie wygląda to zbyt elegancko...

Z góry dziękuję za pomoc.
Pozdrawiam

0

a Symfony to nie model MVC przypadkiem? Czyli chcesz żeby metody modelu miały dostęp do komponentów widoku?

0
Miang napisał(a):

a Symfony to nie model MVC przypadkiem?

ho ho ho, ten MVC w symfony to faktycznie tyle ma wspólnego z MVC...

0

Chyba w ogóle mowa o CMD a nie pchaniu wyniku do przeglądarki?

0

Dokładnie tak jak napisał @jurek1980 - w tym przypadku chodzi o polecenie uruchamiane z systemu.

https://symfony.com/doc/current/console.html

0

Jesli to singleton to zrobilbym to jako zmienna globalna ale jesli to ma byc instancja klasy to przekazywalbym za kazdym razem jako parametr

0

Zrób w serwisie metodę setProgressBar() lub publiczną, typowaną, nullowalną właściwość (w zależności od twojego coding style) która przyjmie instancję paska postępu i klasa będzie sobie na niej operować jeśli będzie ustawiona

1 użytkowników online, w tym zalogowanych: 0, gości: 1