Okamžité vytvoření nadefinované služby
- uestla
- Backer | 799
Dobrý podvečer.
Lze nějakým způsobem v configu říci, že
nějaká služba se má ihned vytvořit – ne až
při požádání o ni?
Např. když si definuji službu coby továrničku
na vlastní formulářový prvek a chci, aby
se hned zaregistroval:
services:
formControlFactory:
factory: FormControlFactory( ... )
setup:
- @self::register()
Při tomto zápisu se prvek registruje až
když požádám o $container->formControlFactory
.
Jde to udělat hned?
Díky!
- Filip Procházka
- Moderator | 4668
Moc nechápu proč je to jako služba, ale budiž. A taky bych doporučil vytvářet tu instanci v register a vracet ji, dost se to pak zjednoduší.
services:
formControlFactory:
factory: FormControlFactory::register()
run: true
- uestla
- Backer | 799
Super, díky moc – run
jsem nějak nevyčetl…
V register metodě (nestatické!) se extenduje
Forms\Container
o příslušnou přidávací metodu.
Chápu, že to působí zbytečně jako služba,
když ji pak nikde nevyužiju, na druhou stranu
mi přijde pěkné mít to v configu, kde si mohu
snadno vyřešit závislosti…
Více viz: https://forum.nette.org/…-nette-forms#…
- Filip Procházka
- Moderator | 4668
Moc se mi to nelíbí. Tak jak to máš teď, tak je to dost nepěkná třída. Protože v podstatě jenom obaluješ jednu closuru, lepší by bylo dát třídě opravdový smysl a pak jí dát bonus ve formě metody register.
use Nette\Forms\Container;
class ReCaptchaControlFactory extends Nette\Object
{
private $reCaptcha;
private $httpRequest;
public function __construct(ReCaptcha\ReCaptcha $reCaptcha, Nette\Http\Request $httpRequest)
{
$this->reCaptcha = $reCaptcha;
$this->httpRequest = $httpRequest;
}
public function create($label = NULL)
{
return new ReCaptchaControl($this->reCaptcha, $this->httpRequest, $label);
}
public function register($methodName = 'addReCaptcha')
{
$that = $this;
Container::extensionMethod($methodName, function (Container $_this, $name, $label = NULL) use ($that) {
$_this[$name] = $that->create($label);
});
}
}
services:
reCaptchaControlFactory:
class: ReCaptchaControlFactory
setup: [register()]
internal: true # nebude napovídat z $container->
run: true
Editoval HosipLan (30. 9. 2012 23:44)