Jak předat službě veškeré parametry?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Tomáš Votruba
Moderator | 1114
+
0
-

Občas potřebuji někam předat více parametrů, ale nechci to dělat přes předání $this->context->params, ale přes autowiring/inejction (?) určité služby.

Konkrétně bych chtěl mít službu paramService, abych s ní mohl bezproblémově pracovat kdekoliv jinde bez dalších zásahů do configu. Samozřejmě bych si mohl předávat celý context a data vytahovat parameters až v něm, ale to právě nechci.


EDIT: Řešení je až příliš jednoduché :).

services:
	paramServices: ParamService(@container::getParameters())

Nette 2.1-dev

Editoval Schmutzka (18. 3. 2013 2:55)

Filip Procházka
Moderator | 4668
+
0
-

To co hledáš je nějaký Configuration objekt.

class FooConfiguration extends Nette\Object
{
	public $foo;
	public $bar;
}

class Foo extends Nette\Object
{
	private $config;
	public function__construct(FooConfiguration $config)
	{
		$this->config = $config;
	}
}
services:
	fooConfig: FooConfiguration
		setup:
			- $foo(%foo.foo%)
			- $bar(%foo.bar%)
	foo: Foo

Pro detailnější příklad koukni třeba na moje facebook sdk, které tohle používá.

Takhle to má třebadoctrine.

pekelnik
Člen | 462
+
+1
-

Configuration object se samozrejme hodi, ale imho az pro slozitejsi pripady, kdy chces do konfigurace pridat napr. nejake jine sluzby (cache uloziste apod.) jako to dela zminena Doctrine.

Pro jednodussi pripady kdy chci predat jen par parametru je plne funknci reseni tohle:

parameters:
	foo:
		bar: 1
services:
        foo: Services\Foo(%foo%)

Je to ostatne lepsi nez predavat parametry komplet a pak si z nich vyzobat co potrebujes (coz je jen o malo lepsi nez predavat cely kontext a tahat to z nej)

Rika se tomu Law of Demeter – princip minimalni provazanosti (znalosti).

Editoval pekelnik (23. 9. 2012 13:22)

Tomáš Votruba
Moderator | 1114
+
0
-

@hosiplan: Díky, prozkoumám.

@pekelnik: Abych představil konkrétní případ, kterému se chci vyhnout. Jinak tento princip se snažím ctít, pokud není takto kontraproduktivní.

factories:
        myForm: SomeForm(%foo%, %foo2%, %foo3%, %foo4%, %foo5%)
class SomeForm extends From
{
	/** @var array */
	private $foo;

	/** @var array */
	private $foo2;

	/** @var array */
	private $foo3;

	/** @var array */
	private $foo4;

	/** @var array */
	private $foo5;


	public function __construct($foo, $foo2, $foo3, $foo4, $foo5)
	{
		$this->foo = $foo;
		$this->foo2 = $foo2;
		$this->foo3 = $foo3;
		$this->foo4 = $foo4;
		$this->foo5 = $foo5;
	}


	public function build()
	{
		$this->addSelect("someSelect", "Select", $this->foo);
		$this->addSelect("someSelect 2", "Select 2", $this->foo2);
		$this->addSelect("someSelect 3", "Select 3", $this->foo3);
		$this->addSelect("someSelect 4", "Select 4", $this->foo4);
		$this->addSelect("someSelect 5", "Select 5", $this->foo5);

	}
}

Editoval Schmutzka (23. 9. 2012 17:43)

pekelnik
Člen | 462
+
+1
-

Muzes predat libovolnou cast nastaveni:

parameters:
	forms:
		someForm:
			select:
				options:
					one: 1
					two: 2
					three: 3
					four: 4
			radio:
				options:
					one: 1
					two: 2
					three: 3
					four: 4

services:
        someForm: Some\Form(%forms.someForm%)
<?php
class SomeForm extends Form
{
	// ...

	public function __construct($options)
	{
       		$this->options = $options;
	}
}
?>

Editoval pekelnik (23. 9. 2012 20:37)

Tomáš Votruba
Moderator | 1114
+
0
-

To počítá s tím, že žádný formulář nebude mít společný select s jiným formulářem, ne?

pekelnik
Člen | 462
+
0
-

no tak urcite :D

je to jenom priklad… o spolecne konfiguraci selectu napric formularema zatim nebyla rec ;)