Správné použití Dependency Injection

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

Zdravím, snažím se pochopit a nějakým rozumným způsobem začít využívát DI. Pročetl jsem pár stran v dokumentaci, např. https://doc.nette.org/…dependencies a potom jsem to chtěl ozkoušet, mám:

HomepagePresenter

namespace App\FrontModule\Presenters;

class HomepagePresenter extends BasePresenter {
    private $HomepageTest;

    public function __construct(HomepageTest $test) {
        $this->HomepageTest = $test;
        $this->HomepageTest->HelloFromModel();
    }
}

HomepageTest

namespace App\Model;
class HomepageTest extends \Nette\Object {
    public function HelloFromModel()
    {
        echo "Ahoj z modelu!!!";
    }
}

config.neon

services:
        HomepageTest: App\Model\HomepageTest
        - App\Model\UserManager

Bohužel mi tracy hlasí:

Nette\DI\ServiceCreationException

Class App\FrontModule\Presenters\HomepageTest needed by App\FrontModule\Presenters\HomepagePresenter::__construct() not found. Check type hint and 'use' statements.

Co mi uteklo? Díky za odpověd

David Matějka
Moderator | 6445
+
+3
-

namespace

App\FrontModule\Presenters\HomepageTest !== App\Model\HomepageTest

ikysek
Člen | 22
+
-1
-

To co mi tracy vyhazuje chápu, hledá soubor HomepageTest jinde než ve skutečnosti je, bohužel netuším proč, to je to o co mi šlo.

Oli
Člen | 1215
+
+3
-

Však ti na to @DavidMatějka odpověděl ;-)
Ty říkáš, že presenter má hledat HomepageTest ve jmeným prostoru App\FrontModule\Presenters\HomepageTest. Tam ho ale nikdy nenajde, protože on ve skutečnosti je v App\Model\HomepageTest Správně to je např takhle:

public function __construct(\App\Model\HomepageTest $test) {
        $this->HomepageTest = $test;
        $this->HomepageTest->HelloFromModel();
    }
ikysek
Člen | 22
+
0
-

Díky, odpoveď v podobě kódu je pro mě jak raffaelo, více než tisíc slov =)

Jan Endel
Člen | 1016
+
0
-

Namespace strašně matou, to že tam jsou lomítka neznamená, že je to cesta v adresáři. :-)

Ondris
Člen | 37
+
-1
-

do konstruktoru v presenteru napiš

public function __construct(\App\Model\HomepageTest $test) {
        $this->HomepageTest = $test;
        $this->HomepageTest->HelloFromModel();
    }

Editoval Ondris (4. 3. 2015 20:35)