Vlastní autentifikátor propojení Doctrine
- kloban
- Člen | 123
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
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