Zaregistrovaný model a presenter
- brontosaurus
- Člen | 49
Mám vytvořený model, který je zaregistrovaný v config.neon jako služba a neumím to správně zpracovat v presenteru…
Model :
<?php
namespace App\Model;
use Nette;
class MujModel {
/** @var \Nette\Database\Context */
public $database;
public function __construct(\Nette\Database\Context $database) {
$this->database = $database;
}
public function getDataAll() {
return $this->database->query('SELECT * FROM posts');
}
}
Presenter :
class HomepagePresenter extends BasePresenter
{
/**
* @inject
* @var MujModel */
public $model;
public function renderDefault() {
$this->template->data = $this->model->getDataAll();
}
}
Class or interface ‚App\Presenters\MujModel‘ used in @var annotation at Property [ <default> public $model ] not found. Check annotation and ‚use‘ statements
- Oli
- Člen | 1215
@brontosaurus 1. formátuj kod, kdo má tohle číst?
2. Problém je v namespace. Tvůj model je „celým
názvem“ App\Model\MujModel
, ale v presenteru jsi žádný
namespace nepoužil, proto se vezme ten, který je v té třídě a to je
App\Presenters
. A jistě chápeš, že
App\Model\MujModel
!= App\Presenters\MujModel
.
- brontosaurus
- Člen | 49
Nedal jsem tam kód presenteru celej. Takhle to mám. V netbeans mám kód
naformátovanej, asi se to špatně uloží když to sem vložím..
<?php
namespace App\Presenters;
use Nette,
App\Model;
/**
* Homepage presenter.
*/
class HomepagePresenter extends BasePresenter
{
/**
* @inject
* @var MujModel */
public $model;
public function renderDefault() {
$this->template->data = $this->model->getDataAll();
}
}
- Oli
- Člen | 1215
@brontosaurus podle mě v tomhle případě v tom var musíš mít
Model\MujModel
nebo v use App\Model\MujModel
.
Taková rychlá kontrola je, že když zmáčkneš ctrl a klikneš na tu třídu tak se ti musí otevřít v novým tabu. Pokud se ti neotevře, tak ta třída není dobře napojená (nenašla se).
- brontosaurus
- Člen | 49
<?php
namespace App\Presenters;
use Nette,
App\Model;
/**
* Homepage presenter.
*/
class HomepagePresenter extends BasePresenter
{
/**
* @inject
* @var MujModel */
public $model;
public function renderDefault() {
$this->template->data = $this->model->getDataAll();
}
}
?>
- David Matějka
- Moderator | 6445
Vidis, ze to jde :) ted si precti o tech namespacech, jak radi @Oli a mas to vyreseny ;)
- brontosaurus
- Člen | 49
Tak namespace už je dobře, jestli ještě se mnou máte trpělivost tak bych potřeboval vysvětlit co mám špatně ve fci renderDefault() tu mi to nebere ..Moc nerozumim hlavně tý části $this->template->data
<?php
namespace App\Presenters;
use Nette,
App\Model\MujModel;
/**
* Homepage presenter.
*/
class HomepagePresenter extends BasePresenter
{
/** @var MujModel @inject */
public $model;
public function renderDefault() {
$this->template->data = $this->model->getDataAll();
}
}
?>
- brontosaurus
- Člen | 49
Zkouším vytvořit MVC tak jak jsem se dočetl, že se to má správně
dělat. Tedy vytvořit model, v kterým budou dotazy na data a bude
zaregistrovaný jako služba a nebude v něm inject(ten bude až
v presenteru). Presenter tedy předá data do šablony a ta to zobrazí.
V modelu mám zatím jen jednu metodu(getDataAll, která vypíše všechno
z tabulky posts a v presenteru chci data předat do šablony prostřednictvím
tý metody z modelu. Předá se to tedy proměnnou „data“,jak jsem se teď
dozvěděl ale vyhodí mi to chybu na to, že to nezná tu metodu z modelu.
„Call to undefined method App\Model\MujModel::getDataAll()“
- Freema
- Člen | 18
brontosaurus napsal(a):
Zkouším vytvořit MVC tak jak jsem se dočetl, že se to má správně dělat. Tedy vytvořit model, v kterým budou dotazy na data a bude zaregistrovaný jako služba a nebude v něm inject(ten bude až v presenteru). Presenter tedy předá data do šablony a ta to zobrazí. V modelu mám zatím jen jednu metodu(getDataAll, která vypíše všechno z tabulky posts a v presenteru chci data předat do šablony prostřednictvím tý metody z modelu. Předá se to tedy proměnnou „data“,jak jsem se teď dozvěděl ale vyhodí mi to chybu na to, že to nezná tu metodu z modelu.
„Call to undefined method App\Model\MujModel::getDataAll()“
Nemáš jen tak náhodou tu metodu:
<?php
private function getDataAll()
?>
nebo
<?php
protected function getDataAll()
?>
:)
Editoval Freema (13. 5. 2015 16:58)
- Džůny
- Člen | 19
@brontosaurus Jak vypadá řádek s inject modelu teď? Ve tvé poslední ukázce kódu u něj totiž nemáš uvedený celý namespace. Podle dokumentace by uveden být měl, třeba bude problém tady.