[ZF] Functie wordt (automatisch) op verkeerde class aangeroepen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Kurt Cobain

Kurt Cobain

07/06/2011 13:20:55
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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}


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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$attemptReturn
= SessionController::setSession('credentials', $_POST);
?>


in SessionController::setSession r86:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
SessionModel::armSession(self::uId(), session_id());
?>


in SessionModel::armSession r10/12:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
    public function armSession($uId, $sessionId)
    {

        self::insert(array('...
?>


Ik zie zo niets dat ik verkeerd doe.
Gewijzigd op 07/06/2011 13:24:00 door Kurt Cobain
 
PHP hulp

PHP hulp

20/04/2024 12:32:50
 
Kees Schepers

kees Schepers

07/06/2011 13:25:40
Quote Anchor link
Je code is een beetje vaag en onduidelijk om daar iets mee te kunnen. Heb je geen betere snippet?
 
Kurt Cobain

Kurt Cobain

07/06/2011 13:34:57
Quote Anchor link
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.
 
Kees Schepers

kees Schepers

07/06/2011 15:49:16
Quote Anchor link
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
Gewijzigd op 07/06/2011 15:58:35 door kees Schepers
 
Kurt Cobain

Kurt Cobain

07/06/2011 16:18:54
Quote Anchor link
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.
 
Niels K

Niels K

07/06/2011 17:41:42
Quote Anchor link
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.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php

BaseController extends Zend_Controller_Action
{
    public function preDispatch() {
        parent::preDispatch();
    }

    public function test() {}
}


UserController extends BaseController
{
    public function preDispatch() {
        parent::preDispatch();
        $this->test();
    }
}


?>


Dit werkt gewoon bij mij?

Model aanroepen kan toch gewoon zo?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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('.. = ?', '..');

?>


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
 
Kurt Cobain

Kurt Cobain

07/06/2011 23:51:12
Quote Anchor link
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.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php

BaseController extends Zend_Controller_Action
{
    public function preDispatch() {
        parent::preDispatch();
    }

    public function test() {}
}


UserController extends BaseController
{
    public function preDispatch() {
        parent::preDispatch();
        $this->test();
    }
}


?>


Dit werkt gewoon bij mij?

Model aanroepen kan toch gewoon zo?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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('.. = ?', '..');

?>


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.
 
Kees Schepers

kees Schepers

08/06/2011 00:01:10
Quote Anchor link
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?

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?
 
Pieter van Linschoten

Pieter van Linschoten

08/06/2011 00:37:52
Quote Anchor link
Je gebruikt self::insert(array('...

Ik neem aan dat je het volgende gebruikt?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
SessionModel extends Zend_Db_Table_Abstract
{
...


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
 
Niels K

Niels K

08/06/2011 18:56:22
Quote Anchor link
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)
 
Pieter van Linschoten

Pieter van Linschoten

08/06/2011 21:31:36
Quote Anchor link
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.
 
Kurt Cobain

Kurt Cobain

09/06/2011 18:29:10
Quote Anchor link
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.
 
Niels K

Niels K

09/06/2011 18:36:28
Quote Anchor link
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.
 
Kees Schepers

kees Schepers

09/06/2011 18:41:24
Quote Anchor link
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
Gewijzigd op 09/06/2011 18:42:18 door kees Schepers
 
Niels K

Niels K

09/06/2011 18:45:18
Quote Anchor link
Ik heb het tweakers topic even doorgelezen, maar ik had je de oplossing dus al gegeven (tussen neus en lippen door)

Van tweakers:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$sessionModel
= new SessionModel();
$sessionModel->armSession(self::uId(), session_id());
?>


Van mij: (Was een voorbeeld)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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('.. = ?', '..');

?>


En dan vind je het raar dat wij het niet snappen?
 
Pieter van Linschoten

Pieter van Linschoten

09/06/2011 20:48:02
Quote Anchor link
Nou breekt mijn klomp.

Hier stond het gewoon:
Pieter van Linschoten op 08/06/2011 21:31:36:
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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.