Vytvorenie factory z DI cez dalsiu sluzbu

duskohu
Člen | 778
+
0
-

Ahojte, mam takuto sluzbu, pokial som ju spravne zaregistroval, chcem aby pri kazdom volani mi vratilo novu instanciu.
a mam nejaku dalsiu sluzbu ktorej poslem clasu a poteboval by som aby mi vracala ked ju zavolam tu factory, (stale novu instanciu), ako sa to da riesit?

Neviem ci je na to nutne pouzivat tu IExcerptMetaProvider mozno staci zaregistrovat len ExcerptMetaProvider

interface IExcerptMetaProvider
{

    /**
     * @return ExcerptMetaProvider
     */
    function create();
}
excerptMetaProvider:
        implement: Nas\ComponenteModule\MetaProviders\IExcerptMetaProvider
        inject: true
class PostMetaResolver
{

    /** @var Container */
    private $container;

    /**
     * @param Container $container
     */
    public function __construct(Container $container)
    {
        $this->container = $container;
    }

    /**
     * @param MetaProvider $metaProvider
     * @return IPostMetaProvider|IComponent|NULL
     */
    public function getMetaProvider($metaProvider)
    {

        // $metaProvider->class class Nas\ComponenteModule\MetaProviders\IExcerptMetaProvider
        $this->container ....


        if (!$service) {
            throw  new \InvalidArgumentException('Meta provider with name: "' . $metaProvider->class . '" not found!');
        }

        $service->setOptions($metaProvider->getOptions());
        $service->setMetaClass($metaProvider->getMetaClass());
        return $service ? $service : null;
    }
}

Editoval duskohu (18. 7. 2019 17:36)

filsedla
Člen | 101
+
+1
-

Ahoj,
není možné definovat službu tak, aby „při každém volání vracelo novou instanci“.

Pokud vytvoříš interface, ve skutečnosti jsi definoval druhou službu (factory), která bude vracet instance.
(Rada v důsledku: když použiješ automaticky generované továrny pomocí implement:, měl bys interface nazvat ...Factory, aby bylo jasné, že rozhraní a třída označuje továrnu.)

Máš dvě možnosti. Můžeš použít

$this->container->createService($name, $args = [])

pokud chceš opravdu vytvářet instanci služby, kterou máš nakonfigurovanou v configu. Potřebuješ název služby v configu $name anebo si název zjistíš pomocí $container->findByType($class) : string[].

Nebo použiješ rovnou

$this->container->createInstance($class, $args = [])

Ani v jenom případě není potřeba interface.

Editoval filsedla (18. 7. 2019 20:51)

duskohu
Člen | 778
+
0
-

@filsedla Dik, funguje perfektne

CZechBoY
Člen | 3608
+
0
-

A je potreba to resit primo pres DIC? Neslo by to pres tu tovarnu? Misto tridy k vytvoreni bys volal treba createXxxMetaProvider()

Editoval CZechBoY (19. 7. 2019 7:57)