[ZF] Functie wordt (automatisch) op verkeerde class aangeroepen
Hallo,
Ik zit met een probleem waar ik toch echt niet zelf uit kom. Ik ben er al twee dagen mee bezig (niet continu, maar in totaal toch echt een dikke twee uur).
Het zit zo.
In een controller, roep ik een functie aan uit een andere class, welke eveneens een controller is, maar in dit geval gewoon een container voor die ene functie. Die functie roept op zijn beurt weer het model aan, gebaseerd op Zend_Db_Table_Abstract. De functie die in het model wordt aangeroepen doet een simpele insert() in de betreffende table.
Lijkt allemaal goed te gaan toch?
Nou nee. Ik krijg de error dat de functie _setupPrimaryKey() niet wordt gevonden.
Als ik naar de stack trace kijk, zie ik deels waar het fout gaat. De bovengenoemde functie word op de controller (waarvan de action door ZF wordt aangeroepen in eerste instantie) aangeroepen, en dat is logisch, die heeft de functie _setupPrimaryKey() helemaal niet, want dat is een controller nl Zend_Controller_Action. Zend_Db_Table_Abstract heeft die functie wel.
Ik roep de functie zelf niet aan, dat doet ZF ergens. Waar zit ik fout?
Mijn stack trace:
Zoals je ziet moet het niet LoginController->_setupPrimaryKey() zijn, maar SessionModel->_setupPrimaryKey() of Zend_Db_Table_Abstract->_setupPrimaryKey().
Volgens mij zit er ergens een fout in mijn logica.
in LoginController::action r55:
in SessionController::setSession r86:
in SessionModel::armSession r10/12:
Ik zie zo niets dat ik verkeerd doe.
Ik zit met een probleem waar ik toch echt niet zelf uit kom. Ik ben er al twee dagen mee bezig (niet continu, maar in totaal toch echt een dikke twee uur).
Het zit zo.
In een controller, roep ik een functie aan uit een andere class, welke eveneens een controller is, maar in dit geval gewoon een container voor die ene functie. Die functie roept op zijn beurt weer het model aan, gebaseerd op Zend_Db_Table_Abstract. De functie die in het model wordt aangeroepen doet een simpele insert() in de betreffende table.
Lijkt allemaal goed te gaan toch?
Nou nee. Ik krijg de error dat de functie _setupPrimaryKey() niet wordt gevonden.
Als ik naar de stack trace kijk, zie ik deels waar het fout gaat. De bovengenoemde functie word op de controller (waarvan de action door ZF wordt aangeroepen in eerste instantie) aangeroepen, en dat is logisch, die heeft de functie _setupPrimaryKey() helemaal niet, want dat is een controller nl Zend_Controller_Action. Zend_Db_Table_Abstract heeft die functie wel.
Ik roep de functie zelf niet aan, dat doet ZF ergens. Waar zit ik fout?
Mijn stack trace:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
#0 /home/***/domains/***.nl/library/Zend/Db/Table/Abstract.php(1031): Zend_Controller_Action->__call('_setupPrimaryKe...', Array)
#1 /home/***/domains/***.nl/library/Zend/Db/Table/Abstract.php(1031): LoginController->_setupPrimaryKey()
#2 /home/***/domains/***.nl/application/alpha/models/SessionModel.php(15): Zend_Db_Table_Abstract->insert(Array)
#3 /home/***/domains/***.nl/application/alpha/controllers/SessionController.php(86): SessionModel->armSession('973', '013748b2d049a25...')
#4 /home/***/domains/***.nl/application/alpha/controllers/SessionController.php(54): SessionController->armSession()
#5 /home/***/domains/***.nl/application/alpha/controllers/LoginController.php(55): SessionController->setSession('credentials', Array)
#6 /home/***/domains/***.nl/library/Zend/Controller/Action.php(513): LoginController->indexAction()
#7 /home/***/domains/***.nl/library/Zend/Controller/Dispatcher/Standard.php(295): Zend_Controller_Action->dispatch('indexAction')
#8 /home/***/domains/***.nl/library/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#9 /home/***/domains/***.nl/library/Zend/Application/Bootstrap/Bootstrap.php(97): Zend_Controller_Front->dispatch()
#10 /home/***/domains/***.nl/library/Zend/Application.php(366): Zend_Application_Bootstrap_Bootstrap->run()
#11 /home/***/domains/***.nl/public_html/alpha/index.php(30): Zend_Application->run()
#12 {main}
#1 /home/***/domains/***.nl/library/Zend/Db/Table/Abstract.php(1031): LoginController->_setupPrimaryKey()
#2 /home/***/domains/***.nl/application/alpha/models/SessionModel.php(15): Zend_Db_Table_Abstract->insert(Array)
#3 /home/***/domains/***.nl/application/alpha/controllers/SessionController.php(86): SessionModel->armSession('973', '013748b2d049a25...')
#4 /home/***/domains/***.nl/application/alpha/controllers/SessionController.php(54): SessionController->armSession()
#5 /home/***/domains/***.nl/application/alpha/controllers/LoginController.php(55): SessionController->setSession('credentials', Array)
#6 /home/***/domains/***.nl/library/Zend/Controller/Action.php(513): LoginController->indexAction()
#7 /home/***/domains/***.nl/library/Zend/Controller/Dispatcher/Standard.php(295): Zend_Controller_Action->dispatch('indexAction')
#8 /home/***/domains/***.nl/library/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#9 /home/***/domains/***.nl/library/Zend/Application/Bootstrap/Bootstrap.php(97): Zend_Controller_Front->dispatch()
#10 /home/***/domains/***.nl/library/Zend/Application.php(366): Zend_Application_Bootstrap_Bootstrap->run()
#11 /home/***/domains/***.nl/public_html/alpha/index.php(30): Zend_Application->run()
#12 {main}
Zoals je ziet moet het niet LoginController->_setupPrimaryKey() zijn, maar SessionModel->_setupPrimaryKey() of Zend_Db_Table_Abstract->_setupPrimaryKey().
Volgens mij zit er ergens een fout in mijn logica.
in LoginController::action r55:
in SessionController::setSession r86:
in SessionModel::armSession r10/12:
Ik zie zo niets dat ik verkeerd doe.
Gewijzigd op 07/06/2011 13:24:00 door Kurt Cobain
Gesponsorde koppelingen:
Je code is een beetje vaag en onduidelijk om daar iets mee te kunnen. Heb je geen betere snippet?
Buiten deze methodes om kan de fout niet zitten (of het moet in ZF zitten), dus meer is niet nodig en alleen maar overbodig.
In combinatie met de stack trace kun je alles uit de code halen wat je moet weten in verband met de foutmelding. De rest doet er toch niet toe.
In combinatie met de stack trace kun je alles uit de code halen wat je moet weten in verband met de foutmelding. De rest doet er toch niet toe.
Prima, als jij niet meer informatie wilt prijsgeven bepaal je natuurlijk helemaal zelf. Maar ik denk niet dat op deze manier mensen je echt kunnen helpen met je probleem, althans ik in iedergeval niet.
Waarom is de functie armSession niet gedclareert als static? Deze word alleen vanuit een static context aangeroepen of niet? Lijkt me dan sowieso veiliger om het keyword static ervoor te zetten.
Ik weet niet of je dit goed doorgenomen hebt? Daar staat wel aardig wat over het aanroepen van static methods:
http://php.net/manual/en/language.oop5.late-static-bindings.php
Waarom is de functie armSession niet gedclareert als static? Deze word alleen vanuit een static context aangeroepen of niet? Lijkt me dan sowieso veiliger om het keyword static ervoor te zetten.
Ik weet niet of je dit goed doorgenomen hebt? Daar staat wel aardig wat over het aanroepen van static methods:
http://php.net/manual/en/language.oop5.late-static-bindings.php
Gewijzigd op 07/06/2011 15:58:35 door kees Schepers
Het gaat mij er niet om hoeveel code ik laat zien, de rest is totaal niet nuttig. Ik kan wel de rest van de bestanden hier neer gaan pleuren, maar om hier duizenden regels code neer te pleuren is ook zo lullig terwijl het om die regels gaat..
Waarom geen static functie?
ZF wil in z'n Zend_Db_Table_Abstract gewoon $this gebruiken in plaats van self::, dat zou resulteren in een mooie error.
Het zou inderdaad wel de oplossing kunnen zijn. Toch maar weer verder Googlen.
Waarom geen static functie?
ZF wil in z'n Zend_Db_Table_Abstract gewoon $this gebruiken in plaats van self::, dat zou resulteren in een mooie error.
Het zou inderdaad wel de oplossing kunnen zijn. Toch maar weer verder Googlen.
Waarom wil je een userController en een Sessie controller hebben? In de userController kan je toch gebruik maken van Zend_Auth / Zend_Session ?
Daarnaast moet je een model gewoon instantieren.
Dit werkt gewoon bij mij?
Model aanroepen kan toch gewoon zo?
Je legt het allemaal een beetje summier uit.. Komt misschien omdat ik een zware werkdag heb gehad maar ik begrijp niet veel van je verhaal :)
Niels
Daarnaast moet je een model gewoon instantieren.
Code (php)
Dit werkt gewoon bij mij?
Model aanroepen kan toch gewoon zo?
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
$tableUser = new Table_User();
$tableUser->insertUser($params);
// Of gewoon in de controller (niet heel netjes)
$tableUser->insert('.. = ?', '..');
?>
$tableUser = new Table_User();
$tableUser->insertUser($params);
// Of gewoon in de controller (niet heel netjes)
$tableUser->insert('.. = ?', '..');
?>
Je legt het allemaal een beetje summier uit.. Komt misschien omdat ik een zware werkdag heb gehad maar ik begrijp niet veel van je verhaal :)
Niels
Niels Kieviet op 07/06/2011 17:41:42:
Waarom wil je een userController en een Sessie controller hebben? In de userController kan je toch gebruik maken van Zend_Auth / Zend_Session ?
Daarnaast moet je een model gewoon instantieren.
Dit werkt gewoon bij mij?
Model aanroepen kan toch gewoon zo?
Je legt het allemaal een beetje summier uit.. Komt misschien omdat ik een zware werkdag heb gehad maar ik begrijp niet veel van je verhaal :)
Niels
Daarnaast moet je een model gewoon instantieren.
Code (php)
Dit werkt gewoon bij mij?
Model aanroepen kan toch gewoon zo?
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
$tableUser = new Table_User();
$tableUser->insertUser($params);
// Of gewoon in de controller (niet heel netjes)
$tableUser->insert('.. = ?', '..');
?>
$tableUser = new Table_User();
$tableUser->insertUser($params);
// Of gewoon in de controller (niet heel netjes)
$tableUser->insert('.. = ?', '..');
?>
Je legt het allemaal een beetje summier uit.. Komt misschien omdat ik een zware werkdag heb gehad maar ik begrijp niet veel van je verhaal :)
Niels
Waarom ik die controllers wil hebben daar gaat het toch niet om? Het gaat er om dat het gescheiden is. Als iemand inlogt, dan mag er eerst een hoop gebeuren wat met het daadwerkelijke inloggen te maken heeft, en dan pas wat er met de sessie gebeurt, wat dus in het sessie object thuis hoort. Of moet ik die ene functie uit de omgeving halen waar ie hoort omdat die toevallig (ook) voor de login nodig is?
Overigens is dit ook niet het probleem, als ik het in de class superMooieClass zet en die aanroep vanuit LoginController, dan zal dat niet veel uitmaken.
Moet ik het summier beschrijven en je een hoop tijd besparen die je anders kwijt was geweest met het doorspitten van elle lange classes? Dit is alleen de code waar het om gaat, dus waarom de rest posten? Zit toch niets in wat hier van toepassing op is..
Hoe ik een model aanroep weet ik ook wel, het gaat er om dat die functie op een verkeerd object wordt aangeroepen.
Static methode er van maken gaat niet werken, omdat ZF dan probeert de methode in een object omgeving aan te roepen terwijl die omgeving er niet is.
Met keyword static word tegen de parent gebruikt vanuit de context waarin hij aangeroepen is en dat heet late static binding. Ik denk ook niet dat is wat je zoekt.
Verder, verwachten wij niet dat je hele lappen code gaat posten inderdaad, maar 3 regeltjes code zonder context of iets erbij is wat Niels zegt vrij summier. Jij zit in het project en snapt waarschijnlijk helemaal hoe het in elkaar zit. Wij moeten ons daarin verdiepen en met iets meer context zou dat wel fijn zijn.
Static de insert method van een model aanroepen is mij ook een beetje vreemd. Zou niet weten waarom je dat zou willen.
Verder, kom je vrij geïrriteerd over, terwijl wij je alleen maar proberen te helpen en vragen naar meer informatie.
Als je van:
self::insert(array('...
SessionMode::insert(array('...
Maakt, wat doet dat dan?
Je roept het static aan dus sowieso is er geen sprake van een object? Misschien gaat het daarom ook wel fout?
Verder, verwachten wij niet dat je hele lappen code gaat posten inderdaad, maar 3 regeltjes code zonder context of iets erbij is wat Niels zegt vrij summier. Jij zit in het project en snapt waarschijnlijk helemaal hoe het in elkaar zit. Wij moeten ons daarin verdiepen en met iets meer context zou dat wel fijn zijn.
Static de insert method van een model aanroepen is mij ook een beetje vreemd. Zou niet weten waarom je dat zou willen.
Verder, kom je vrij geïrriteerd over, terwijl wij je alleen maar proberen te helpen en vragen naar meer informatie.
Als je van:
self::insert(array('...
SessionMode::insert(array('...
Maakt, wat doet dat dan?
Quote:
Hoe ik een model aanroep weet ik ook wel, het gaat er om dat die functie op een verkeerd object wordt aangeroepen.
Je roept het static aan dus sowieso is er geen sprake van een object? Misschien gaat het daarom ook wel fout?
Je gebruikt self::insert(array('...
Ik neem aan dat je het volgende gebruikt?
Volgens mij moet je als je Zend_Db_Table_Abstract insert als singleton gebruikt, parent::insert(array('... aanroepen.
Dit is zomaar een idee.
Volgens mij gebruikt insert() nu de verkeerde parent om _setupPrimaryKey op aan te roepen.
Ik neem aan dat je het volgende gebruikt?
Volgens mij moet je als je Zend_Db_Table_Abstract insert als singleton gebruikt, parent::insert(array('... aanroepen.
Dit is zomaar een idee.
Volgens mij gebruikt insert() nu de verkeerde parent om _setupPrimaryKey op aan te roepen.
Gewijzigd op 08/06/2011 00:41:11 door Pieter van Linschoten
Quote:
Als iemand inlogt, dan mag er eerst een hoop gebeuren wat met het daadwerkelijke inloggen te maken heeft.
Ja, maar misschien heeft Zend_Framework dat al helemaal voor je geregeld?
Een controller is er toch niet voor om iets op te slaan of te onthouden?
Quote:
Jij zit in het project en snapt waarschijnlijk helemaal hoe het in elkaar zit. Wij moeten ons daarin verdiepen en met iets meer context zou dat wel fijn zijn.
Precies, wij zijn niet helderziend of iets in die geest. Het zal wel aan mij liggen maar ik begrijp er nog steeds niet veel van, terwijl ik toch dagelijks met Zend_Framework werk.
Quote:
Volgens mij moet je als je Zend_Db_Table_Abstract insert als singleton gebruikt, parent::insert(array('... aanroepen.
Geen parent insert maar gewoon $this->insert(), een model moet naar mijn weten gewoon een object zijn.
Ik begin maar wat te gokken hoor, maar wanneer je de primary key wilt aangeven kan je $_primary gebruiken. (In het model)
Niels Kieviet op 08/06/2011 18:56:22:
Geen parent insert maar gewoon $this->insert(), een model moet naar mijn weten gewoon een object zijn.
Dat idee had ik dus ook. Maar 't blijft gokken met 3 regels context.
Geweldig hoe ik hier allemaal gezeik krijg over dat ik meer code moet plaatsen terwijl ik met de zelfde regels code en m'n stack trace op T.net binnen tien minuten de tip kreeg die naar mijn antwoord leidde.
De rest van de code heeft niets te maken met iéts wat daar gebeurt. Ik kan er beter een verhaaltje bij typen over hoe een aap een banaan eet dan de rest van de code posten, zo ver staat het van elkaar.
Waarom moet er in mijn login controller nog een hoop gebeuren dat ZF niet kan doen? Tsja, dat is juist mijn systeem, ik wil m'n functioneel model wel hier posten, maar daar hebben jullie ook niets aan. Is ook al niet nuttig omdat het zo specifiek is.
Wat ben ik blij dat ik ver door de nieuwe site PHPHulp al gedag heb gezegd! Al die mensen die je proberen te 'helpen' en tegelijkertijd alleen maar HUN manier doordrukken, terwijl ik zelf toch veel beter weet hoe mijn systeem in elkaar moet gaan steken, of ligt dat aan mij?
Succes hier verder. Ik heb weer gelijk gekregen, PHPHulp kom je geen steek verder mee.
De rest van de code heeft niets te maken met iéts wat daar gebeurt. Ik kan er beter een verhaaltje bij typen over hoe een aap een banaan eet dan de rest van de code posten, zo ver staat het van elkaar.
Waarom moet er in mijn login controller nog een hoop gebeuren dat ZF niet kan doen? Tsja, dat is juist mijn systeem, ik wil m'n functioneel model wel hier posten, maar daar hebben jullie ook niets aan. Is ook al niet nuttig omdat het zo specifiek is.
Wat ben ik blij dat ik ver door de nieuwe site PHPHulp al gedag heb gezegd! Al die mensen die je proberen te 'helpen' en tegelijkertijd alleen maar HUN manier doordrukken, terwijl ik zelf toch veel beter weet hoe mijn systeem in elkaar moet gaan steken, of ligt dat aan mij?
Succes hier verder. Ik heb weer gelijk gekregen, PHPHulp kom je geen steek verder mee.
Quote:
Geweldig hoe ik hier allemaal gezeik krijg over dat ik meer code moet plaatsen terwijl ik met de zelfde regels code en m'n stack trace op T.net binnen tien minuten de tip kreeg die naar mijn antwoord leidde.
Het gaat mij niet zo zeer om de code maar om jouw uitleg en wat er precies fout gaat. Ik snapte maar gedeeltelijk wat je bedoelde. Dat heb ik toch gezegd?
Kan je het antwoord misschien hier plaatsen? Dan kunnen mensen daar misschien nog wat van leren.
Quote:
Waarom moet er in mijn login controller nog een hoop gebeuren dat ZF niet kan doen? Tsja, dat is juist mijn systeem, ik wil m'n functioneel model wel hier posten, maar daar hebben jullie ook niets aan. Is ook al niet nuttig omdat het zo specifiek is.
Ok, duidelijk.
Quote:
Wat ben ik blij dat ik ver door de nieuwe site PHPHulp al gedag heb gezegd! Al die mensen die je proberen te 'helpen' en tegelijkertijd alleen maar HUN manier doordrukken, terwijl ik zelf toch veel beter weet hoe mijn systeem in elkaar moet gaan steken, of ligt dat aan mij?
Als je met Zend Framework programmeerd moet je jezelf aan een aantal standaarden houden, zeker als je via het MVC model programmeert.
Dat jij je ego belangrijker vind als de hulp die mensen je hier proberen aan te bieden, is alleen maar jammer. Ik zou zeggen als jij je zoveel beter voelt als iedereen hier, inderdaad lekker weg blijven heeft ook niemand last van je!
Blijkbaar had je nog geen gedag gezegd, want je hebt toch nog geprobeerd. Dat wij niet super geniaal zijn zoals jij was dan helaas een teleurstelling voor je.
Verder is het best grappig dat ze op Tweakers.net ook informatie uit je moeten trekken voor ze kunnen analyseren wat het probleem is.
http://gathering.tweakers.net/forum/list_messages/1460199
Blijkbaar had je nog geen gedag gezegd, want je hebt toch nog geprobeerd. Dat wij niet super geniaal zijn zoals jij was dan helaas een teleurstelling voor je.
Verder is het best grappig dat ze op Tweakers.net ook informatie uit je moeten trekken voor ze kunnen analyseren wat het probleem is.
http://gathering.tweakers.net/forum/list_messages/1460199
Gewijzigd op 09/06/2011 18:42:18 door kees Schepers
Ik heb het tweakers topic even doorgelezen, maar ik had je de oplossing dus al gegeven (tussen neus en lippen door)
Van tweakers:
Van mij: (Was een voorbeeld)
En dan vind je het raar dat wij het niet snappen?
Van tweakers:
Code (php)
1
2
3
4
2
3
4
<?php
$sessionModel = new SessionModel();
$sessionModel->armSession(self::uId(), session_id());
?>
$sessionModel = new SessionModel();
$sessionModel->armSession(self::uId(), session_id());
?>
Van mij: (Was een voorbeeld)
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
$tableUser = new Table_User();
$tableUser->insertUser($params);
// Of gewoon in de controller (niet heel netjes)
$tableUser->insert('.. = ?', '..');
?>
$tableUser = new Table_User();
$tableUser->insertUser($params);
// Of gewoon in de controller (niet heel netjes)
$tableUser->insert('.. = ?', '..');
?>
En dan vind je het raar dat wij het niet snappen?
Nou breekt mijn klomp.
Hier stond het gewoon:
En maar janken dat je geen hulp krijgt. Blijf alsjeblieft weg hier.
Hier stond het gewoon:
Pieter van Linschoten op 08/06/2011 21:31:36:
Dat idee had ik dus ook. Maar 't blijft gokken met 3 regels context.
Niels Kieviet op 08/06/2011 18:56:22:
Geen parent insert maar gewoon $this->insert(), een model moet naar mijn weten gewoon een object zijn.
Dat idee had ik dus ook. Maar 't blijft gokken met 3 regels context.
En maar janken dat je geen hulp krijgt. Blijf alsjeblieft weg hier.



