Object of class Nette\Database\Connection to string conversion u vývojové verzi

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

Ahoj chtěl jsem se zeptat mám projekt a na verzi 2.0.7 mi jede bezproblému, ale když tam nahraji vývojovou verzi, tak to přestane fungovat a výpíše to tuto chybu.

Object of class Nette\Database\Connection to string conversion

Nevíte čím vy to moghlo být děkuji. (Všiml jsem si že má problém s interátorem ve foreach a dále s databází). Seklo se to třeba na tomto řádků $data = $this->database->table(‚session‘)->find($id);

enumag
Člen | 2118
+
0
-

Mohl bys ukázat laděnku?

zool
Člen | 144
+
0
-

Asi takto

Source file

File: ...\geb\libs\Nette\Database\Reflection\ConventionalReflection.php:54

44:     { 45:         $this->primary = $primary; 46:         $this->foreign = $foreign; 47:         $this->table = $table; 48:     } 49: 50: 51: 52:     public function getPrimary($table) 53:     { 54:         return sprintf($this->primary, $this->getColumnFromTable($table)); 55:     } 56: 57: 58:

Call stack

    ...\geb\libs\Nette\Database\Reflection\ConventionalReflection.php:54	source  sprintf (arguments)

    ...\geb\libs\Nette\Database\Table\Selection.php:98	source  Nette\Database\Reflection\ConventionalReflection-> getPrimary (arguments)

    ...\geb\libs\Nette\Database\Table\SelectionFactory.php:47	source  Nette\Database\Table\Selection-> __construct (arguments)

    ...\geb\libs\Nette\Database\Connection.php:192	source  Nette\Database\Table\SelectionFactory-> create (arguments)

    ...\geb\libs\MySessionStorage.php:35	source  Nette\Database\Connection-> table (arguments)

    25:         //sleep(0.9); 26:         $this->database->exec("SELECT RELEASE_LOCK('session_$id')"); 27:         return true; 28:     } 29:     /**\ 30:      * @param $id 31:      * @return string 32:      */ 33:     public function read($id) 34:     { 35:         $data = $this->database->table('session')->find($id); 36:         if($data->count('*')) 37:             $data = $data->fetch()->data; 38:         else 39:             $data = "";
enumag
Člen | 2118
+
0
-

Kdo se v tom má vyznat? Normálně v browseru Ctrl+S a někam upnout. (Sice nebude klikatelná, ale co potřebuju si rozbalim přes firebug.)

vvoody
Člen | 910
+
0
-

Poprosím config, konkrétne nette sekciu kde nastavuješ reflection a taktiež továrničku na connection vo vygenerovanom DI containery (temp/cache/_Nette.Configurator/…). Len nezabudni zmazat heslo do db :D

zool
Člen | 144
+
0
-
common:
	parameters:
		database:
			driver: mysql
			host: ....
			dbname: ....
			user: ....
			password: ....


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

	nette:
		container:
			debugger: TRUE
			catchExceptions: true
		routing:
			debugger: true
		application:
			debugger: true
		security:
			debugger: true
		session:
			autoStart: smart
			expiration: +15 days
		database:
			default:
				dsn: '%database.driver%:host=%database.host%;dbname=%database.dbname%'
				user: %database.user%
				password: %database.password%
				reflection: conventional
				debugger: true
				explain: true
		#latte:
		#	macros:
		#		- 'Zool\Macro\MyMacro::install(?->compiler)'(@self)

	services:
		routerFactory: RouterFactory
		router: @routerFactory::createRouter
		database: @nette.database.default
		stranky: \StrankyModel( @database )
		model: \Model( @database )
		sessionStorage: MySessionStorage(@database)
		session:
			setup:
				- setStorage(@sessionStorage)



	factories:


production < common:
	parameters:
		database:
			driver: mysql
			host: ....
			dbname: .....
			user: .....
			password: ....

development < common:
	parameters:
		database:
			driver: mysql
			host: localhost
			dbname: ...
			user: ....
			password:...
enumag
Člen | 2118
+
0
-

Že ty někde v aplikaci voláš new Selection(…). U Selection se měnily parametry konstruktoru, takže to musíš upravit.

EDIT: \StrankyModel a \Model nejsou doufám potomky Selection, že ne?

Editoval enumag (27. 12. 2012 19:38)

zool
Člen | 144
+
0
-

Určitě nevolám…
jak říkám sekne se to na

$data = $this->database->table('session')->find($id);
zool
Člen | 144
+
0
-

enumag napsal(a):

EDIT: \StrankyModel a \Model nejsou doufám potomky Selection, že ne?

Máš pravdu není

class Model extends Nette\Object
{
	private $database;

	public function __construct(Nette\Database\Connection $database)
	{
		$this->database = $database;
	}

Editoval zool (27. 12. 2012 19:44)

enumag
Člen | 2118
+
0
-

Aha, už asi chápu v čem je problém, ale ještě nevím jak ho opravit…

Vlastnost $primary v reflection je kdovíproč Connection namísto stringu. Důvod bude zřejmě ten, že se do konstruktoru ConventionalReflection nějak dostanou parametry pro konstruktor DiscoveredReflection.

Přidej do konstruktoru ConventionalReflection throw new \Exception(); a nahraj laděnku pls.

Editoval enumag (27. 12. 2012 19:48)

vvoody
Člen | 910
+
0
-

vvoody napsal(a):

a taktiež továrničku na connection vo vygenerovanom DI containery (temp/cache/_Nette.Configurator/…).

Este toto prosim, ide o metodu kde sa instancuje Connection

protected function createServiceNette__database__default()

alebo nejaky podobny nazov. Niekde v tej metode by malo byt (asi nespravne) instancovanie Reflection

zool
Člen | 144
+
0
-

Když řádek v configu

reflection: conventional

Zakomentuju, tak to projde ale vznikne chyba

uksort() expects parameter 1 to be array, null given
na řádku

<?php $iterations = 0; foreach ($iterator = $_l->its[] = new Nette\Iterators\CachingIterator($polozky) as $polozka): ?>
zool
Člen | 144
+
0
-

enumag napsal(a):

Přidej do konstruktoru ConventionalReflection throw new \Exception(); a nahraj laděnku pls.

je to tam

http://www.shopars.cz/chyba2.htm

enumag
Člen | 2118
+
0
-

No jasně… protože se v tu chvíli použije DiscoveredReflection. Později to selže protože $polozky je NULL.

Jinak chyba je zde. Předává se tam @self, což je Connection.

EDIT: Nemám teď čas to opravovat a psát test, takže to buď udělej sám nebo dej issue na GitHub.

Dočasný workaround, který by mohl fungovat:

	reflection: Nette\Database\Reflection\ConventionalReflection

Editoval enumag (27. 12. 2012 19:59)

zool
Člen | 144
+
0
-

vvoody napsal(a):
Este toto prosim, ide o metodu kde sa instancuje Connection

protected function createServiceNette__database__default()

alebo nejaky podobny nazov. Niekde v tej metode by malo byt (asi nespravne) instancovanie Reflection

Snad je to dobře

protected function createServiceNette__database__default()
	{
		$service = new Nette\Database\Connection('mysql:host=localhost;dbname=....', 'root', NULL, NULL);
		$this->callInjects($service);
		$service->setSelectionFactory(new Nette\Database\Table\SelectionFactory($service, new Nette\Database\Reflection\ConventionalReflection($service), $this->getService('cacheStorage')));
		Nette\Diagnostics\Debugger::$blueScreen->addPanel('Nette\\Database\\Diagnostics\\ConnectionPanel::renderException');
		Nette\Database\Helpers::createDebugPanel($service, TRUE);
		return $service;
	}
zool
Člen | 144
+
0
-

enumag napsal(a):

No jasně… protože se v tu chvíli použije DiscoveredReflection. Později to selže protože $polozky je NULL.

Jinak chyba je zde. Předává se tam @self, což je Connection.

Můžeš mi prosím trochu objasnit ten zavináč předtím self? A jak jsi zjistil je to typu Connection?

enumag
Člen | 2118
+
0
-

Protože zde se jen připraví $reflection a až zde se použije. Ve chvíli kdy se použije jsi v kontextu vytváření Connection a @self odkazuje na právě vytvářenou službu.

EDIT: Pomohlo co jsem napsal? Můžeš dát na GitHub tu issue? Tohle je v každém případě bug.

Editoval enumag (27. 12. 2012 20:50)

zool
Člen | 144
+
0
-

Myslíš jestli pomohlo toto?

reflection: Nette\Database\Reflection\ConventionalReflection

v configu? Tak to nepomohlo…
Ještě jsem nic na GitHub nedával můžeš mě navést jak to tam mám dát, jen nástřel… Díky

Editoval zool (27. 12. 2012 21:26)

enumag
Člen | 2118
+
0
-

Škoda. :-( V tom přípapadě se ten bug vztahuje i na libovolnou vlastní reflection. Snad to bude brzy opravené.

Jsi zaregistrován na GitHubu? Pokud ne, zaregistruj se. Potom si otevři New Issue tady. Vyplň o co jde (Chybná inicializace ConventionalReflection), přidej linky na tohle vlákno a na problematický commit. Je zvykem psát issues anglicky, ale pokud ji napíšeš česky, nikomu to vadit nebude.

Tu issue bych založil sám, ale myslím, že by tohle měl umět každý Nettista. ;-)