AmbiguousServiceException pri obnoveni backlinku
- edke
- Člen | 198
Asi mam zle navrhnuty BasePresenter, pretoze pri obnoveni backlinku
/**
* @persistent
*/
public $backlink = null;
public function Login_onApply( SubmitButton $button)
{
try {
...
$this->getApplication()->restoreRequest($this->backlink);
$this->redirect('User:');
...
dostanem AmbiguousServiceException v startup() BasePresentra pri nastaveni services:
public function startup()
{
parent::startup();
# user authentication
--> Environment::getServiceLocator()->addService( new AclFrontend, 'Nette\Security\IAuthorizator' );
Environment::getServiceLocator()->addService( new App_Uzivatel, 'Nette\Security\IAuthenticator' );
$user = Environment::getUser();
$user->setNamespace('Frontend');
...
Nerozumiem presne postupu pri backlinku, ale akoby sa na backlink nepustil redirect ale po spracovani handlera sa odznovu pustil startup BasePresentera. Vie niekto poradit ?
- LM
- Člen | 206
Při restoreRequest()
se ten požadavek forwarduje (tedy živ.
cyklus probíhá od znovu, přesměrovává to až
Presenter::canonicalize()
a to pouze pokud nejde o POST
požadavek), proto se startup()
volá více krát.
Registrování služeb by mělo být v bootstrapu, anebo je registrovat pouze pokud neexistují.
- edke
- Člen | 198
LM wrote:
Při
restoreRequest()
se ten požadavek forwarduje (tedy živ. cyklus probíhá od znovu, přesměrovává to ažPresenter::canonicalize()
a to pouze pokud nejde o POST požadavek), proto sestartup()
volá více krát.
hej, to mi je uz teraz jasne.
Registrování služeb by mělo být v bootstrapu, anebo je registrovat pouze pokud neexistují.
No tu mam problem s tym, preto to definujem v presenteri a nie v bootstrape, pretoze ta definicia sa moze lisit, su rozne moduly v aplikacii, ktore vyzaduju rozne sluzby. Napriklad ‚Nette\Security\IAuthorizator‘ mam jednu triedu pre frontend a jednu pre backend. Rovnako pre ‚Nette\Security\IAuthenticator‘ sa sql tabulky uzivatelov lisia. Ako to potom vyriesit ?
- David Grudl
- Nette Core | 8218
Nebo třeba přidat volání inicializačních funkcí
do $application->onStartup
$application->onStartup[] = 'Model::initialize';
$application->onStartup[] = 'Services::initialize';
Výhoda inicializace v onStartup
je, že případnou výjimku
zpracuje aplikace, tedy Error presenter.
- LM
- Člen | 206
edke napsal(a):
No tu mam problem s tym, preto to definujem v presenteri a nie v bootstrape, pretoze ta definicia sa moze lisit, su rozne moduly v aplikacii, ktore vyzaduju rozne sluzby. Napriklad ‚Nette\Security\IAuthorizator‘ mam jednu triedu pre frontend a jednu pre backend. Rovnako pre ‚Nette\Security\IAuthenticator‘ sa sql tabulky uzivatelov lisia. Ako to potom vyriesit ?
Pak můžeš službu odebrat removeService()
a nahradit jinou,
anebo přizpůsobit ten authenticator.
- Etch
- Člen | 403
edke napsal(a):
Jod wrote:
Ja to robím napr u modelu tak, že zistím či service už existuje, ak nie vytvorím ho.
Toto som skusal aj ja, ale nenasiel som sposob, ako zistit, ci uz dana service existuje. Ako to robis ty ?
To by mělo jít třeba takto
<?php
if (Environment::getServiceLocator()->getService('Nette\Security\IAuthorizator', FALSE) === NULL) {
Environment::getServiceLocator()->addService( new AclFrontend, 'Nette\Security\IAuthorizator' );
}
if (Environment::getServiceLocator()->getService('Nette\Security\IAuthenticator', FALSE) === NULL) {
Environment::getServiceLocator()->addService( new App_Uzivatel, 'Nette\Security\IAuthenticator' );
}
?>