Object of class Nette\Database\Connection to string conversion u vývojové verzi
- zool
- Člen | 144
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);
- zool
- Člen | 144
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 = "";
- zool
- Člen | 144
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:...
- zool
- Člen | 144
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
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
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
enumag napsal(a):
Přidej do konstruktoru ConventionalReflection
throw new \Exception();
a nahraj laděnku pls.
je to tam
- enumag
- Člen | 2118
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
vvoody napsal(a):
Este toto prosim, ide o metodu kde sa instancuje Connectionprotected 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;
}
- enumag
- Člen | 2118
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)
- enumag
- Člen | 2118
Š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. ;-)