Vlastní autentifikátor propojení Doctrine

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

Ahoj,
snažím se vytvořit si vlastní autentifikátor s připojením databáze pomocí doctrine.
Zde je celý můj autentifikátor:

<?php

namespace App\Models;

use Nette\Security as NS,
    App\entities;

class MyAuthenticator extends \Nette\Object implements NS\IAuthenticator
{
    /**
     * @inject
     * @var \Kdyby\Doctrine\EntityManager
     */
    public $EntityManager;

    function authenticate(array $credentials)
    {
        $dao = $this->EntityManager->getRepository(entities\Uzivatel::getClassName());

        list($username, $password) = $credentials;

        $row = $dao->findOneBy(array('prezdivka' => $username));

        if (!$row) {
            throw new NS\AuthenticationException('User not found.');
        }

        if (!NS\Passwords::verify($password, $row->password)) {
            throw new NS\AuthenticationException('Invalid password.');
        }

        return new NS\Identity($row->id, $row->role, array('username' => $row->username));
    }
}

Chybu mi to píše tuto:
Call to a member function getRepository() on a non-object
Na řádku $dao = $this->EntityManager->getRepository(entities\Uzivatel::getClassName());

Chyba je zapříčiněna právě tím, že se jedná o rozhraní implements NS\IAuthenticator.
Konstrukce s plněním proměnné dao mi v presenterech normálně funguje.
Netuším ale proč to nejde zde a jak to vyřešit.
Prosím tedy o radu a nasměrování.

japijana
Člen | 11
+
+2
-

mimo presenterov nefunguje predavanie zavislosti cez „inject“ anotacie. Preto $this->EntityManager nie je žiadny objekt.

Entity manager si ziadaj ako param v konstruktore tej triedy a nasledne si autentifikator registruj v configu ako sluzbu. Ak aj \Kdyby\Doctrine\EntityManager mas reg v configu, Nette DI sa postara o spravne vytvorenie autentifikatora. Vyborny tahak od David Matějka čo kde použiť.

services:
	-App\Models\MyAuthenticator
enumag
Člen | 2118
+
+1
-

Inject anotace mimo presentery fungují pokud té službě přidáš inject tag. Obecně se to ale nedoporučuje.

kloban
Člen | 123
+
0
-

Díky. O nemožnosti použití inject anotace mimo presenter jsem už asi někde slyšel, ale vůbec mě to nedošlo.