Circular reference detected for services

- Radkos
- Člen | 62
Zdravím, asi se to tu už několikrát řešilo, ale jak se mám zbavit
této chyby?
Circular reference detected for services: application.8, security.user, authenticator, 85_App_Models_Facades_UsersFacade
<?php
namespace App\Models;
use Nette;
use Kdyby\Doctrine\EntityManager;
use App\Models\Facades\UsersFacade;
/**
* Class BaseManager
* @package App\Models
*/
abstract class BaseManager extends Nette\Object
{
/** @var EntityManager */
protected $entityManager;
/** @var Nette\Http\Session */
protected $session;
/** @var UsersFacade */
protected $usersFacade;
/**
* BaseManager constructor.
* @param EntityManager $entityManager
* @param Nette\Http\Session $session
* @param UsersFacade $usersFacade
*/
public function __construct(EntityManager $entityManager, Nette\Http\Session $session, UsersFacade $usersFacade)
{
$this->entityManager = $entityManager;
$this->session = $session;
$this->usersFacade = $usersFacade;
}
}
<?php
namespace App\Models\Authenticators;
use Nette\Security as NS;
use App\Models\BaseManager;
class Authenticator extends BaseManager implements NS\IAuthenticator
{
function authenticate(array $credentials)
{
list($username, $password) = $credentials;
$user = $this->usersFacade->getUserByUsername($username);
if (!$user) {
throw new NS\AuthenticationException('Uživatel nenalezen.');
}
if (!NS\Passwords::verify($password, $user->password)) {
throw new NS\AuthenticationException('Špatné heslo.');
}
$role = "admin";
return new NS\Identity($user->id, $role);
}
}

- David Matějka
- Moderator | 6445
co vyzaduje UserFacade za zavislosti? predpokladam, ze Nette\Security\User?
nejlepsi je, kdyz udelas Authenticator jako samotnou sluzbu, ktera nededi od BaseManageru (a base tridy jsou obecne antipattern a je lepsi je nepouzivat)

- Radkos
- Člen | 62
David Matějka napsal(a):
co vyzaduje UserFacade za zavislosti? predpokladam, ze Nette\Security\User?
nejlepsi je, kdyz udelas Authenticator jako samotnou sluzbu, ktera nededi od BaseManageru (a base tridy jsou obecne antipattern a je lepsi je nepouzivat)
No UserFacade dědí taky od BaseManageru. Ještě v nette nejsem moc zběhlý, jak udělám tu službu?

- David Matějka
- Moderator | 6445
No UserFacade dědí taky od BaseManageru
v tom pripade je problem asi tady. protoze ta sluzba je tim padem zavisla sama na sobe.
fakt nejlepsi bude, kdyz zadny „base manager“ nebudes pouzivat

- Šaman
- Člen | 2668
Já si na získávání uživatelů pro potřeby autenticatoru vytvořil
vlastní jednoduchou třídu (UserDAO).
Narozdíl od UserRepository, která dědí od základního
Repository (což bude předpokládám podobné, jako tvůj
BaseManager). Tuhle třídu (UserRepository) pak
používám všude jinde v aplikaci – umí toho víc a hlavně vrací
entity, nebo kolekce záznamů, zatímco UserDAO vrací jen
array.
Editoval Šaman (21. 12. 2017 21:42)