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)