@inject modelu v presenteru

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

Zdravím,
po delším hledání jsem stále nenalezl řešení mého problému s použitím modelu v presenteru pomocí @inject.

Použiju-li klasicky přes konstruktor do parametru (ProjectManager $projectManager), tak to funguje. S @injectem mi to ale hlásí „Call to a member function test() on null“.

app/model/ProjectManager.php

namespace App\Model;
use Nette;

class ProjectManager extends Nette\Object {
    private $db;

    public function __construct(Nette\Database\Context $db) {
        $this->db = $db;
    }

    public function test() {
        echo "...";
    }
}

HomepagePresenter

use App\Model\ProjectManager;

class HomepagePresenter extends OnlyLoggedPresenter
{
    /** @var ProjectManager @inject */
    public $projectManager;

    function __construct() {
        $this->projectManager->test();
    }
}

Services

services:
        router: App\RouterFactory::createRouter
        authenticator: Authenticator
        - App\Model\ProjectManager

Zkoušel jsem i /** var App\Model\ProjectManager @inject */, ale bez úspěchu.

Zkoukl jsem si povídání a několik témat, ale odpověď jsem nenalezl.
Díky

Martk
Člen | 661
+
+2
-

Tento inject se nevolá před konstruktorem, vyzkoušej to v metodě startup nebo klidně můžeš udělat constructor inject:

use App\Model\ProjectManager;

class HomepagePresenter extends OnlyLoggedPresenter
{
    /** @var ProjectManager */
    protected $projectManager;

    function __construct(ProjectManager $projectManager) {
		$this->projectManager = $projectManager;
        $this->projectManager->test();
    }
}

Editoval Antik (26. 6. 2016 23:37)

hrubysi
Člen | 12
+
0
-

V tom startupu to opravdu funguje, díky za vysvětlení :)

GEpic
Člen | 566
+
+2
-

Antik napsal(a):

Tento inject se nevolá před konstruktorem, vyzkoušej to v metodě startup nebo klidně můžeš udělat constructor inject:

use App\Model\ProjectManager;

class HomepagePresenter extends OnlyLoggedPresenter
{
    /** @var ProjectManager @inject */
    protected $projectManager;

    function __construct(ProjectManager $projectManager) {
		$this->projectManager = $projectManager;
        $this->projectManager->test();
    }
}

Jen si rýpnu, ale zde není anotace @inject potřebná. To pouze v případě, že je proměnná public a v tom případě není potřeba konstruktor. To já jen tak, aby se předešlo situacím „používám to, protože to tak někdo napsal“. :)

Martk
Člen | 661
+
0
-

:) to kopirovani je zlost, diky opraveno.

hrubysi
Člen | 12
+
0
-

Asi se zeptám hloupě, ale pokud použiju konstruktor, k čemu bych tam ještě měl definovat:
/** @var ProjectManager */
Funguje to i bez toho. Díky

Šaman
Člen | 2666
+
+4
-

hrubysi napsal(a):

Asi se zeptám hloupě, ale pokud použiju konstruktor, k čemu bych tam ještě měl definovat:
/** @var ProjectManager */
Funguje to i bez toho. Díky

Některá IDE to využijí pro našeptávání. Z pohledu PHP to nutné není (a ani nekontroluje, jestli tam dosadíš správný typ), ale pokud chceš psát i v PHP jako v silně typovém jazyku, tak tohle je cesta. Většina IDE ji umí zpracovat, i když technicky je to komentář.