Jak předat konstruktoru služby parametr z presenteru

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

Zdravím. Mám třídu

class TestGrid {

function __construct(Nette\Http\Session $s, Nette\Database\Context $dbContext /*, $test */)
	{
	// jak sem tohle dostat?:
	// dump($test);
}
}

V config.neon

	services:
		testGrid:
			class: TestGrid ()
			autowired: FALSE

V presenteru:

/** @return TestGrid */
protected function createComponentTestGrid() {
	return $this->context->createService('testGrid');
}

v šabloně:

{control testGrid}

Chtěl bych v metodě renderDefault() předat parametr $test, se kterým by mohla služba uvedená v configu pracovat, ale nevím jak. Snad chápu správně, že Nette předá službě parametry, které jsou uvedené v její deklaraci, ale jak mám docílit, aby se tam dostal další parametr z presenteru? Něco jako

public function renderDefault($id) {

    $this['testGrid']->test = $id; //tohle se ale do konstruktoru nedostane
}

Dík.

Casper
Člen | 253
+
0
-

„Továrnám lze na rozdíl od služeb předávat parametry“ – viz dokumentace.

Pokud jde tedy o nějaký parametr, který službu konfiguruje, použij v neonu class: TestGrid(..., ..., %test%) a nadefinuj i parametr test. Jinak budeš muset použít nějaký setter. Každopádně je na zvážení, zda je to skutečně dobrý přístup, pokud potřebuješ v konstruktoru služby nějaký parametr, který ji nekonfiguruje.

Editoval Casper (10. 3. 2014 14:06)

ludek
Člen | 83
+
0
-

Díky. V dokumentaci se píše o „factories:“, což je asi zavrženo. Snad nějak takhle?

config.neon:

	services:
		testGrid:
			parameters: [test]
			class: TestGrid(..., ..., %test% )
			autowired: FALSE

služba:

class TestGrid {
function __construct(Nette\Http\Session $s, Nette\Database\Context $dbContext, $test /*<----*/) {

     dump($test);
}
}

presenter:

class DashboardPresenter {

	public $test;

	public function actionDefault($id) { /* render ne, to už je asi pozdě */

               $this->test = $id;
	}

	protected function createComponentTestGrid() {

            return $this->context->createService('testGrid', array('test'=>$this->test)/*<----*/);
	}