Databáze v BasePresenteru, ale i ostatních

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

Zdravím,

momentálně řeším problém při využítí MySQL databáze jak v basePresenteru, tak ale i ostatních. V basePresenter navážu spojení, abych mohl do @layout.latte vypsal některá data právě přímo z databáze, ale tu potřebuji využít i u ostatních presenterů (např. pagePresenter) kde zas vypisuju jednotlivé stránky. Momentálně to mám napsané viz. níže, ale v jiných presenterech narážím na chybu „Call to a member function table() on a non-object“.

Možná je má představa celá špatně. Budu rád za vaše rady. Díky.

basePresenter

abstract class BasePresenter extends Nette\Application\UI\Presenter
{

	private $database;

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

settingsPresenter

class SettingsPresenter extends BasePresenter
{

	private $database;

	public function renderBasic()
	{

		/* Load existing settings */
		$settings = $this->database->table('settings')->get(1);

		if (!$settings) {
			$this->error('Nenalezena konfigurace aplikace.');
		}

	}

}
Jiří Nápravník
Člen | 710
+
0
-

Tohle jsou základy PHP, máš tu database v BasePresenteru jako private, musí být aspoň protected, aby jsi ji viděl i v potomcích…

V Presenterech správně nemá databáze co dělat, od toho je model.

mrfrostikcz
Člen | 17
+
0
-

Jiří Nápravník napsal(a):

Tohle jsou základy PHP, máš tu database v BasePresenteru jako private, musí být aspoň protected, aby jsi ji viděl i v potomcích…

V Presenterech správně nemá databáze co dělat, od toho je model.

Super, děkuji. A ještě děkuju za tip, na to se určitě podívám aby to bylo řešené lépe.

Tomáš Kolinger
Člen | 136
+
0
-

Doporučuju u presenteru místo constructoru využít @inject anotace na obstarání závilostí. Určitě ti to ušetří hodně psaní. Tím rovnou vyřešíš tvůj problém s viditelností.

/**
 * @var \Nette\Database\Context
 * @inject
 */
public $database;