Generované továrničky a předání závislostí
- tttpapi
- Člen | 100
Ahoj,
mám formulář pro komentáře.
<?php
class DocumentCommentsForm extends Control {
private $documentId;
private $documentsModel;
public function __construct(\App\Model\Documents $documentsModel, $id) {
parent::__construct();
$this->documentsModel = $documentsModel;
$this->documentId = $id;
}
?>
Rozhraní pro továrničku:
<?php
interface IDocumentCommentsFormFactory {
/** @return \DocumentCommentsForm */
function create();
}
?>
A config:
<?php
services:
- IDocumentCommentsFormFactory
?>
V presenteru volám následující kód:
<?php
public function createComponentDocumentCommentsForm() {
$control = $this->documentCommentsFormFactory->create($this->id);
return $control;
}
?>
Bohužel mi to s parametrem nefunguje.
Chyba:
Service ‚68_IDocumentCommentsFormFactory‘: Parameter $id in
DocumentCommentsForm::__construct() has no type hint, so its value must be
specified
A netuším, jak to změnit, aby to fungovalo s parametry. Snažil jsem se prohledat úplně všechno, ale odpověď jsem bohužel nenašel.
Díky za pomoc.
EDITED:
Verze Nette 2.1.4
Editoval tttpapi (9. 7. 2014 10:58)
- Michal Vyšinský
- Člen | 608
Ahoj,
doporučuji dávat autowire služby nakonec, povinné parametry jako
první, takže:
<?php
class DocumentCommentsForm extends Control {
private $documentId;
private $documentsModel;
public function __construct($id, \App\Model\Documents $documentsModel) {
parent::__construct();
$this->documentsModel = $documentsModel;
$this->documentId = $id;
}
?>
<?php
interface IDocumentCommentsFormFactory {
/** @return \DocumentCommentsForm */
function create($id);
}
?>
Pak musíš v konfiguraci nette říct, že má počítat s parametrem metody create:
services:
- implement: IDocumentCommentsFormFactory
parameters: [id]
arguments: [%id%]
Důvod, proč doporučuji dávat autowire služby až nakonec je ten, že když je dáš na začátek, musíš dát v neonu:
services:
- implement: IDocumentCommentsFormFactory
parameters: [id]
arguments: [.., %id%]
Editoval Michal Vyšinský (9. 7. 2014 10:54)
- tttpapi
- Člen | 100
Díky. Jenom mi to teda v neonu křičí Unexpected ‚:‘ on line
33, column 13.
U implement.
<?php
services:
- implement: IDocumentCommentsFormFactory
parameters: [id]
arguments: [%id%]
?>
Nette mám verzi 2.1.4.
EDIT:
Když jsem smazal tu dvojtečku, tak mi to zase hlásí, že mi chybí parameter
id.
Missing parameter ‚id‘
Editoval tttpapi (9. 7. 2014 11:11)
- David Matějka
- Moderator | 6445
tahle zkracena syntaxe v neonu je podporovana az od 2.2.
A taky v 2.1 neni fixnuty jeden bug, takze budes muset uvest i class,
celkem tedy:
services:
-
class: DocumentCommentsForm
implement: IDocumentCommentsFormFactory
parameters: [id]
arguments: [%id%]