Dědění továrniček na komponenty a jejich závislosti
- uestla
- Backer | 799
Zdravím.
Jelikož se nám ruku v ruce s DI mírně rozzbytečněli
factories
v configu, řeším teď, jak správně uchopit
dědění komponent a jejich závislostí.
Jde v podstatě o to, že jedn. komponenty v mé aplikaci
dědí od společné BaseControl
, na jejíž úrovni už
se vyskytují určité závislosti (helpery pro view, atd.).
Problém je v tom, že v configu jsem schopen předat
tyhle závislosti továrničce, ale ta samotná pak musí
tyhle závislosti předat dál vytvářené komponentě.
Lepší bude to ukázat na příkladě – řekněme, že budeme
mít komponentu TaskList
dědící od BaseControlu
a
tomu odpovídající továrničky.
BaseControlFactory.php
abstract class BaseControlFactory extends Nette\Object
{
/** @var ViewHelpers */
protected $helpers;
function __construct(ViewHelpers $dh)
{
$this->helpers = $dh;
}
}
BaseControl.php
abstract class BaseControl extends UI\Control
{
/** @var ViewHelpers */
protected $helpers;
function injectHelpers(ViewHelpers $dh)
{
$this->helpers = $dh;
}
}
TaskListControlFactory.php
class TaskListControlFactory extends BaseControlFactory
{
function create()
{
$c = new TaskListControl; // (extends BaseControl)
// predani zavislosti rucne? pro kazdou komponentu dedici od BaseControl?
return $c;
}
}
Zatím jsem to vyřešil přímočaře pomocí eventů,
nevýhoda je v tom, že je třeba je volat ručně.
Automatizovaná metoda mě bohužel žádná nenapadla:
abstract class BaseControlFactory extends Nette\Object
{
/** @var ViewHelpers */
protected $helpers;
/** @var array */
public $onCreate = array();
function __construct(ViewHelpers $dh)
{
$this->helpers = $dh;
$me = $this;
$this->onCreate[] = function (Components\BaseControl $control) use ($me) {
$control->injectHelpers( $me->defaultHelpers );
};
}
}
class TaskListControlFactory extends BaseControlFactory
{
function create()
{
$c = new TaskListControl;
$this->onCreate( $c ); // nutno volat v každém potomkovi...
return $c;
}
}
Je možné toto řešit jinak – lépe?
Díky!