AmbiguousServi­ceException pri obnoveni backlinku

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

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

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

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 se startup() 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 ?

Jod
Člen | 701
+
0
-

Ja to robím napr u modelu tak, že zistím či service už existuje, ak nie vytvorím ho.

David Grudl
Nette Core | 8218
+
0
-

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

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.

edke
Člen | 198
+
0
-

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 ?

Etch
Člen | 403
+
0
-

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' );
}
?>
Jod
Člen | 701
+
0
-

Ano, ano, tak tak =)

<?php
	function isModel()
	{
		return !(null === Environment::getServiceLocator()->getService('Model', FALSE));
	}
?>
pmg
Člen | 372
+
0
-

Prosím zkrátit. ;-)

Environment::getService('Model', FALSE);