Připojení do DB z BasePresenteru
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- JanBE
- Člen | 62
Zdravím,
potřebuji se v Basepresenteru připojit do DB, abych mohl uložit do
persistentní proměnné jeden údaj z db..
Nevím proč mi to nejde jako u ostataních presenterů, nevidíte
někdo chybu?
abstract class BasePresenter extends Nette\Application\UI\Presenter
{
private $database;
public function __construct(\Nette\Database\Context $database)
{
$this->database = $database;
}
/** @persistent */
public $lang;
public $top_color;
protected function startup()
{
parent::startup();
if (!isset($this->lang))
{
$this->lang = $this->getHttpRequest()->detectLanguage(array('en', 'cs'));
$this->canonicalize();
}
$this->top_color = $this->database->table('table')->select('col')->fetch();
}
hlásí chybu:
Call to a member function table() on a non-object
Editoval JanBE (6. 6. 2014 12:58)
- Jan Suchánek
- Člen | 404
Nemělo by to být něco jako?
abstract class BasePresenter extends Nette\Application\UI\Presenter
{
/**
* @var \Nette\Database\Context
* @inject
*/
public $dbContext;
/** @persistent */
public $lang;
public $top_color;
protected function startup()
{
parent::startup();
$this->top_color = $this->dbContext->table('table')->select('col')->fetch();
}
Editoval jenicek (6. 6. 2014 13:08)
- Šaman
- Člen | 2666
JanBE napsal(a):
Zdravím,
potřebuji se v Basepresenteru připojit do DB, abych mohl uložit do persistentní proměnné jeden údaj z db..
Nevím proč mi to nejde jako u ostataních presenterů, nevidíte někdo chybu?abstract class BasePresenter extends Nette\Application\UI\Presenter { private $database; public function __construct(\Nette\Database\Context $database) { $this->database = $database; } /** @persistent */ public $lang; public $top_color; protected function startup() { parent::startup(); if (!isset($this->lang)) { $this->lang = $this->getHttpRequest()->detectLanguage(array('en', 'cs')); $this->canonicalize(); } $this->top_color = $this->database->table('table')->select('col')->fetch(); }
hlásí chybu:
Call to a member function table() on a non-object
- Protože private property nevidí potomci. Zkus použít protected.
- Protože potomci přepisují konstruktor? V BasePresenterech se doporučuje použít inject metody, nebo anotaci @inject nad public property, viz příspěvek nademnou. Necháš si tak čistý konstruktor pro potřeby předáváni závislostí do potomků.
Editoval Šaman (6. 6. 2014 17:59)