Vytvorenie factory z DI cez dalsiu sluzbu
- duskohu
- Člen | 778
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
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)