Circular reference detected pri setupe služby
- iNviNho
- Člen | 352
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
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
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ě.
- David Matějka
- Moderator | 6445
usera tam potrebujes kvuli cemu? identite? to by ti mohl stacit IUserStorage
- iNviNho
- Člen | 352
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
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
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
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.