Generované továrničky a předání závislostí

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

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

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

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

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%]
tttpapi
Člen | 100
+
0
-

Díky moc, už to funguje.