Logování – problém s přístupem do databáze

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

Ahoj,

řeším tu takový problém, rozhodl jsem se ve své miniaplikaci logovat veškeré úkony, které uživatel udělá.
Vytvořil jsem v BasePresenteru funkci logEvent(), která vypadá takto:

	// vlastni logovani udalosti
    public function logEvent($event = null, $type = 'info')
	{
        $data = array();

        $data['datum'] = date('Y-m-d H:i:s');
        $data['nick'] = $this->user->identity->data['nick'];
        $data['typ'] = $type;
        $data['sekce'] = $this->getName() . ":" . $this->getAction() . (isset($id) ? ":" . $id : "");
        $data['udalost'] = $event;

        $this->database->table('log')->insert($data);
    }

Mám ale problém s tím, že když jsem v jiném modelu, než základním, kde se BasePresenter nachází, tak mi Nette vyhazuje tuhle chybu:

Call to a member function table() on a non-object a poukazuje na následující řádek té logovací funkce:

$this->database->table('log')->insert($data);

Přitom v konstruktoru daného presenteru přístup do databáze mám :-(

Co dělám špatně? Neznám Nette příliš do hloubky, takže určitě něco opomíjím. Děkuji za rady.

Editoval dj.kure (25. 5. 2016 12:55)

Jan Endel
Člen | 1016
+
-1
-

Spíše hádám, nezapomínáš v potomkovi volat parent::__construct?

dj.kure
Člen | 70
+
0
-

Když přidám do presenteru, kde logování potřebuji do konstruktoru toto:

parent::__construct();

Tak mi pro změnu začne hlásit nette toto:
Argument 1 passed to App\Presenters\BasePresenter::__construct() must be an instance of Nette\Database\Context, none given...

a odkazuje na BasePresenter takto:

abstract class BasePresenter extends Nette\Application\UI\Presenter
{
    /** @var User @inject */
    public $user;

    /** @var Nette\Database\Context */
    private $database;

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

řádek „public function“…

Editoval dj.kure (25. 5. 2016 13:34)

dj.kure
Člen | 70
+
+1
-

Tak jsem udělal drobnou změnu, doplnil jsem injection a už to funguje, jak má.
Moje chyba.

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