Jak předat službě veškeré parametry?
- Tomáš Votruba
- Moderator | 1114
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
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á.
- pekelnik
- Člen | 462
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
@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
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
To počítá s tím, že žádný formulář nebude mít společný select s jiným formulářem, ne?