Parametr z továrničky do konstruktoru jiné třídy
- CZechBoY
- Člen | 3608
Zdravím,
lze zjednodušit tento PHP kod:
class Component
{
/** @var ClassA */
private $classA;
function __construct($id, IClassAFactory $classAFactory)
{
$this->classA = $classAFactory->create($id);
}
}
class ClassA
{
private $id;
function __construct($id)
{
$this->id = $id;
}
}
interface IClassAFactory
{
/** @return ClassA */
function create($id);
}
na nějakou magii v DIC? Chtěl bych ušetřit tu továrničku na
ClassA
a zbytečný vytváření instance v konstruktoru
Component
.
Díky.
Editoval CZechBoY (29. 6. 2016 17:05)
- David Matějka
- Moderator | 6445
takhle by to mohlo jit:
services:
-
implement: ComponentFactory
parameters: [id]
arguments: [ClassA(%id%)]
- CZechBoY
- Člen | 3608
@DavidMatějka jo, to vypadá dobře, nějak jsem to dal dohromady. Jen malej problém – když mám volitelnej parametr v továrničce a v konstruktoru tý komponenty ho mám jakože povinnej tak jak to udělám přes tu poloautomaticky generovanou továrničku?
class Component
{
function __construct(array $args, ...){}
}
interface IComponentFactory
{
/**
* @param int $id
* @param array $args
* @return Component
*/
function create($id, array $args = []);
}
díky
- CZechBoY
- Člen | 3608
Jsem chtěl aplikovat stejný postup ještě u dalšího páru a háže mi to nesmyslnou hlášku, že nemůže najít ModelA v DIC.
Service '9999_ITableFactory': Service of type aModel needed by Table::__construct() not found. Did you register it in configuration file?
services:
-
implement: ITableFactory
parameters: [userID, array args = []]
arguments: [aModel: ModelA(%userID%), userID: %userID%, args: %args%]
class Table
{
function __construct($userID, array $args = [], SomeAutowiredClass $someClass, ModelA $aModel)
{}
}
interface ITableFactory
{
/**
* @return Table
*/
function create($userID, array $args = []);
}
class ModelA
{
function __construct($userID, abc $abc, def $def)
{}
}
Nevěděl by někdo co s tím?
Editoval CZechBoY (23. 8. 2016 14:28)