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
+
0
-

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
+
0
-

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
+
0
-

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)