Nefunkční metody inject* při dědění presenterů

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

Ahoj, mám následující kód a dokud neinjectuju service cache do presenteru, vše funguje, při přidání injectCache dostanu Notice: Trying to get property of non-object v souboru: File: ...\libs\schmutzka\gettexttranslator\GettextTranslator\Panel\Panel.php což mi přijde jako nesmysl.

Je tedy nějaké omzeneí na inject metody? Něco mi patrně uniká…

config.neon

services:
        cache: \Nette\Caching\Cache ( @cacheStorage, "forminfoeu" )
        translator: @gettextTranslator.translator
abstract class BasePresenter extends \Nette\Application\UI\Presenter
{
    /** @persistent */
    public $lang;

    /** @var GettextTranslator\Gettext */
    protected $translator;


    /**
     * @param GettextTranslator\Gettext
     */
    public function injectTranslator( \GettextTranslator\Gettext $translator)
    {
        $this->translator = $translator;
    }
}
abstract class DefaultPresenter extends \BasePresenter
{
    /**
     *
     * @var Cache
     */
    protected $cache;

    /**
     *
     * @param \Nette\Caching\Cache $cache
     */
    public function injectCache ( \Nette\Caching\Cache  Cache $cache )
    {
        $this->cache = $cache;
    }
}
xificurk
Člen | 121
+
0
-

\Nette\Caching\Cache Cache $cache wtf?

SvvimX
Člen | 65
+
0
-

xificurk napsal(a):

\Nette\Caching\Cache Cache $cache wtf?

wtf asi překlep, mám v kódu nahoře use \Nette\Caching\Cache a kvůli kompletnosti sem to zkopíroval tady do fce a zapomněl smazat to původní Cache, tím to fakt není.

Editoval SvvimX (17. 10. 2013 22:54)

David Matějka
Moderator | 6445
+
0
-

hod sem celou ladenku

SvvimX
Člen | 65
+
0
-

když jsem v bootstrapu dal $configurator->setDebugMode(false); aby se mi zalogovala vyjímka, kterou bych někam uploadnul, tak vypadla uplně jiná vyjímka, než kterou vidím na obrazovce při zaplém debugModu.

V zaplém debugModu vidím chybu, která tvrdí chybu v Schmutzkově translatoru, ale vyjímka, která se zalogovala bez debug modu tvrdí: Multiple services of type Nette\Caching\Cache found což už by dávalo skoro smysl, jen že já v configu jinou cache nemám

neon:

#
# SECURITY WARNING: it is CRITICAL that this file & directory are NOT accessible directly via a web browser!
#
# If you don't protect this directory from direct web access, anybody will be able to see your passwords.
# https://nette.org/en/security-warning
#
common:
	parameters:
		currency: CZK
		vat: 1.0
		database:   #OSTRA DATABAZE !
			driver: pdo_mysql
			host: localhost
			dbname: aaa
			user: root
			password:
			charset: utf8
			collation: utf8_czech_ci

	php:
		date.timezone: Europe/Prague
		session.save_path: "%tempDir%/sessions"
		# zlib.output_compression: yes

	nette:
		session:
			autoStart: smart
			gc_maxlifetime: 1409600

	doctrine:
		connection: %database%

		console: true


	migrations:
		connection: @doctrine.connection

	services:
		cache: \Nette\Caching\Cache ( @cacheStorage, "projekt" )

		database: @doctrine.entityManager

		DAOFactory: \myproject\DAO\DAOFactory ( @database )

		authenticator: \myproject\Security\Authenticator( @DAOFactory )
		authorizator: \myproject\Security\Authorizator( @DAOFactory, @cache )

		translator: @gettextTranslator.translator

		entitySerializer: \Bgy\Doctrine\EntitySerializer( @database )

		eSection:
			class: \Nette\Http\SessionSection(@session, 'exchange')
			setup:
				- setExpiration('+14 days')

		eStorage:
			class: \h4kuna\Storage

		exchange:
			class: \h4kuna\Exchange
			setup:
				- setVat(%vat%)
				- loadCurrency(%currency%, {decimal: 0, symbol: Kč})
				- loadCurrency('eur', {symbol: € })

		userManager: \myproject\Manager\UserManager ( @DAOFactory, @entitySerializer )
		stateManager: \myproject\Manager\StateManager ( @DAOFactory, @entitySerializer )
		roleManager:  \myproject\Manager\RoleManager ( @DAOFactory, @entitySerializer )
		resourceManager: \myproject\Manager\ResourceManager ( @DAOFactory, @entitySerializer )
		permissionManager: \myproject\Manager\PermissionManager ( @DAOFactory, @entitySerializer )
		categoryManager: \myproject\Manager\CategoryManager ( @DAOFactory, @entitySerializer )
		pageManager: \myproject\Manager\PageManager ( @DAOFactory, @entitySerializer )
		langManager: \myproject\Manager\LangManager ( @DAOFactory, @entitySerializer )

	gettextTranslator:
		lang: cs
		files:
			web: %appDir%/lang #
		# optional with defaults
		layout: horizontal # or: vertical
		height: 450

	factories:



production < common:


development < common:
	parameters:
		database:
			dbname: db
			user: root
			password:
David Matějka
Moderator | 6445
+
0
-

ale nette jo lepsi je injectovat jen IStorage a Cache si vytvaret rucne.

ale vetsinou neni cache v presenteru vubec potreba, radeji at se o cachovani stara ta konkretni sluzba. na co tam potrebujes cache?

SvvimX
Člen | 65
+
0
-

injectovat jen storage znamená, že při vyváření cache mi jich vznikne několik, takle sem si v configu hlídal jeden namespace pro cache pro celou aplikaci, přišlo mi to lepší, nevím.

Na co potřebuji v presenteru cache? Vytvářím menu pomocí pluginu Navigation a chtěl jsem kategorie a stránky mít v cache, aby se vždy nenačítali z DB.

A proč vidím jinou chybu v debugModu než se mi pak zaloguje bez něj?