Okamžité vytvoření nadefinované služby

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
uestla
Backer | 799
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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)