Circular reference detected for services

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

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
+
0
-

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
+
0
-

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
+
+1
-

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

Radkos
Člen | 62
+
+1
-

David Matějka napsal(a):

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

Už mi to funguje, díky moc

Šaman
Člen | 2666
+
0
-

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)