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 | 2666
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)