@inject modelu v presenteru
- hrubysi
- Člen | 12
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
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)
- GEpic
- Člen | 566
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“. :)
- Šaman
- Člen | 2666
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ář.