Circular reference detected pri setupe služby

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

Ahojte,

Neviete mi prosím poradiť, prečo mi vyhadzuje Circular reference detected for services: application.3, security.user, authorizator.

# AUTHORIZATOR
	authorizator:
		class: App\Authorization\Authorizator
	# USER
	user:
		class: App\Services\User
		setup:
			- setAuthorizator(@authorizator::create()) // ked zmažem tento riadok, tak to fachá ...

Metóda @authorizator::create() vracia \Nette\Security\Permission a v triede používam Usera kvôli nastaveniu práv.

Jiří Nápravník
Člen | 710
+
+2
-

Pokud píšeš, že v té třídě Authorizator používáš Usera a zároveň třídě User chces tento Authorizator nastavit, tak má kontejner problém. Protože Authorizator žádá Usera, chce se vytvořit User a ten žádá Authorizator, ale Authorizator nemůže být vytvořen, protože hledá toho Usera a to je ta „reference v kruhu“. Řešením je vymyslet ten návrh jinak. Nedává příliš smysl, když jedna třídá závisí na druhé a zároveň ta druhá závisí na první. Takže třeba vytvořit nějakou třídu, která bude záviset na obou a pořeší to za ně.

Marsme
Člen | 75
+
+1
-

Toto je problém autorizátoru. Řešil jsem nedávno https://forum.nette.org/…autorizatoru stále to nemám dořešené protože na to nebyl čas. Nicméně předpokládám že to tam chceš ze stejných důvodů a to pro přístup k identitě.

iNviNho
Člen | 352
+
0
-

Aha rozumiem. Dava to logiku. Takze ma napada, ze permission vytvorim priamo v User triede… Nechcel som porusovat single responsibility

David Matějka
Moderator | 6445
+
+1
-

usera tam potrebujes kvuli cemu? identite? to by ti mohl stacit IUserStorage

iNviNho
Člen | 352
+
0
-

David Matějka napsal(a):

usera tam potrebujes kvuli cemu? identite? to by ti mohl stacit IUserStorage

Potrebujem tam nastaviť rolu a jednotlivé privileges, ktoré má User

Napadlo ma, že tam použijem inú triedu UserService, ktorá pracuje s repozitárom a vracia entity, ale potom musím aj tak odniekadiaľ zohnať uživateľovo ID … Možno by to takto šlo a niekde tam predám ten ID parameter.

<?php
// User class
/**
     * Returns user entity and with entity we should handle everything else
     * It is critical to use this method for getting user data because it
     * goes into database and give us fresh data
     * @return \App\Entities\User
     */
    public function getEntity() {
        return $this->userService->getOneById($this->getId());
    }
?>

Editoval iNviNho (12. 1. 2016 12:48)

David Matějka
Moderator | 6445
+
0
-

privileges userovi nenastavujes, uzivatel ma nejake role. a pak v autorizatoru nastavujes pro ty role jednotliva opravneni.

a role se nastavuje pri autentifikaci jako druhy parametr: https://github.com/…rManager.php#L57

problem je, ze kdyz dojde ke zmene role, tak by se to neaktualizovalo. resi se to treba upravou UserStorage, ktere nacte vzdy aktualni data z db, viz https://github.com/…ity-doctrine

iNviNho
Člen | 352
+
0
-

David Matějka napsal(a):

privileges userovi nenastavujes, uzivatel ma nejake role. a pak v autorizatoru nastavujes pro ty role jednotliva opravneni.

a role se nastavuje pri autentifikaci jako druhy parametr: https://github.com/…rManager.php#L57

problem je, ze kdyz dojde ke zmene role, tak by se to neaktualizovalo. resi se to treba upravou UserStorage, ktere nacte vzdy aktualni data z db, viz https://github.com/…ity-doctrine

Áno, tomu rozumiem, ale nechcem to tak mať. Nechcem mať definované role a pre nich jednotlivé práva.

V administrácií môže superadmin nastavovať adminom privileges pre každý resource ako len chce. Čiže jeden admin môže mať prístup k Produktom, ale môže robiť len akciu „View“, ale niektorí admini môžu robiť aj „View“ aj „Add“ aj „Delete“.

Preto rola je vždy uživateľovo meno + jeho ID. Potom mu nastavím metódou allow privileges ku každému resource tak ako definoval superadmin.

Zatiaľ som sa rozhodovl nastaviť Permission v triede User kým ma nenapadne niečo inovatívnejšie.

pata.kusik111
Člen | 78
+
0
-

iNviNho napsal(a):

David Matějka napsal(a):

privileges userovi nenastavujes, uzivatel ma nejake role. a pak v autorizatoru nastavujes pro ty role jednotliva opravneni.

a role se nastavuje pri autentifikaci jako druhy parametr: https://github.com/…rManager.php#L57

problem je, ze kdyz dojde ke zmene role, tak by se to neaktualizovalo. resi se to treba upravou UserStorage, ktere nacte vzdy aktualni data z db, viz https://github.com/…ity-doctrine

Áno, tomu rozumiem, ale nechcem to tak mať. Nechcem mať definované role a pre nich jednotlivé práva.

V administrácií môže superadmin nastavovať adminom privileges pre každý resource ako len chce. Čiže jeden admin môže mať prístup k Produktom, ale môže robiť len akciu „View“, ale niektorí admini môžu robiť aj „View“ aj „Add“ aj „Delete“.

Preto rola je vždy uživateľovo meno + jeho ID. Potom mu nastavím metódou allow privileges ku každému resource tak ako definoval superadmin.

Zatiaľ som sa rozhodovl nastaviť Permission v triede User kým ma nenapadne niečo inovatívnejšie.

Takovouto aplikaci už jsem řešil. Na způsob, jak to udělat se můžeš podívat na Můj github projekt

V zásadě to fungovalo že co resource, to jeden sloupec v tabulce a hodnota pro řádek (co user) bylo přidělené privilege.