Předání identity uživatele do modelu

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

Ahoj,
potřebuji při zápisu záznamu do databáze zaznamenávat i který uživatel záznam vytvořil.
Mám v modelu třídu Skola a v ní potřebuji znát id uživatele.
Instanci objektu Skola volám z Presenteru AddSkolaPresenter.

Závislost se snažím předat konstruktorem.

Třída Skola vypadá nějak takto:

class Skola extends \Nette\Object
{
    /**
     * @var \Kdyby\Doctrine\EntityManager
     */
    protected $EntityManager;

    /**
     * @var NS\User
     */
    private $MyUser;

    public function __construct(\Kdyby\Doctrine\EntityManager $EntityManager, Nette\Security\User $MyUser)
    {
        $this->EntityManager = $EntityManager;
        $this->MyUser = $MyUser;
    }

    public function add($nazev, $ulice, $co, $cp, $mesto, $psc, $poznamka)
    {
		...
		...
	}
}

V konstruktoru tedy potrebuji ziskat jak připojení do DB tak identitu uživatele.

AddUserPresenter volá instanci takto:

class AddSkolaPresenter extends BasePresenter
{

    /**
     * @inject
     * @var \Kdyby\Doctrine\EntityManager
     */
    public $EntityManager;

	...
	...

    public function PridatSkoluSucceeded($form){

		...

        $Uloz = new Models\Skola($this->EntityManager, $this->user);
        $Uloz->add($nazev, $ulice, $co, $cp, $mesto, $psc, $poznamka);

        $this->flashMessage('Škola přidána.', 'success');
		$this->redirect('this');
    }
}

Připojení do databáze se mi předá user nikoliv.

Nette se tváří, že mu nepředávám instanci App\Models\Nette\Security\User.
`Argument 2 passed to App\Models\Skola::__construct() must be an instance of App\Models\Nette\Security\User, instance of Nette\Security\User given, called in /var/www/obecnaskola/app/presenters/AddSkolaPresenter.php on line 66 and defined `

Díky za rady
Dan

Šaman
Člen | 2635
+
+2
-

Klasická chyba při práci s namespaces. Vždyť ti to píše, že vyžaduješ App\Models\Nette\Security\User, což ty nechceš. Použij sekci use, nebo plné namespace i s úvodním lomítkem.

Editoval Šaman (28. 1. 2016 20:27)

Hurass
Člen | 114
+
+1
-

Přidej nad třídu Skola následující řádek.

use Nette;

Nebo uprav konstruktor.

public function __construct(\Kdyby\Doctrine\EntityManager $EntityManager, \Nette\Security\User $MyUser)
{
    // todo
}
kloban
Člen | 123
+
+1
-

Díky, tam jsem chybu vůbec nehledal. Asi bych tu laděnku měl číst pořádně.

CZechBoY
Člen | 3608
+
+1
-
  • použij DI!

Model zaregistruj do konfiguráku (config.neon třeba) a v presenteru si vyžádej instanci té třídy modelu.

n.u.r.v.
Člen | 485
+
0
-

Ahoj, a je v pořádku když mám model kde potřebuji např. pracovat jen s ID usera, tak že si v tom modelu udělám privátní proměnnou + její setter a v presenteru mám v konstruktoru ten model a ve startupu plním to ID v modelu?

Model mám samozřejmě registrován v neonu v services…

Díky

CZechBoY
Člen | 3608
+
0
-

Ja si vetsinou udelam nejakou dalsi tridu, ktera jen vola metody z modelu, kde to ID je parametr metody.
Te tride pres konstruktor predam ID.