[PHP] webshop->OOP

Pagina: 1
Acties:
  • 135 views sinds 30-01-2008
  • Reageer

Onderwerpen


Verwijderd

Topicstarter
ik heb een webshop geschreven in een OOP stijl(alsjeblieft geen discussie nu of php oop is of kan of niet, dat beweer ik niet, ik hanteer alleen zoveel mogelijk de oop stijl wat je in elke taal kan doen) en uiteraard kan je hierin via een form verschillende acties uitvoeren zoals: een product in de winkelwagen stoppen, inloggen, product weggooien, bestelling doorvoeren, enz...
mijn punt: het zijn allemaal verschillende dingen die je dmv een POST methode behandelt.

ik heb een object winkelwagen die onder andere een methode voegBestellingToe() bevat. dit object wordt aangemaakt in index.php. Als ik nu een product in mn winkelwagen wil stoppen, dan moet die methode aangeroepen worden van dat object: winkelwagen->voegBestellingToe()

ik heb ook een object klant en deze bevat een methode wijzigGegevens(). dit object wordt ook gecreert in index.php. De gegevens kunnen dmv een form te submitten veranderd wordern/

nu kan ik in index.php heel makkelijk zien of er een formulier gesubmit is, en vervolgens een actie ondernemen, maar hoe kan ik nou netjes zien welke methode van welk object genomen moet worden?...

ik hoop dat ik het probleem een beetje duidelijk omschreven heb...maar tis niet makkelijk :)

edit:

Oops...titel vergeten...die moest ik nog verzinnen,....

[ Voor 4% gewijzigd door Verwijderd op 30-12-2004 01:10 ]


  • faabman
  • Registratie: Januari 2001
  • Laatst online: 08-08-2024
dan geef je toch een (extra) parameter mee aan de Get of Post die je verstuurd met je formulier???

bijvoorbeeld

<form action="default.php?class=foo&method=bar">

de class en de method kun je vervolgens beide in een select of switch gooien (hoe heet dat in php) en dan kun je bepalen welke method van welke class aangeroepen moet worden....

[ Voor 38% gewijzigd door faabman op 30-12-2004 01:14 ]

Op zoek naar een baan als Coldfusion webdeveloper? Mail me!


Verwijderd

Topicstarter
Ja, daar heb ik ook aan zitten denken, maar dat betekent dat ik bij elk formulier dat ik verstuur een objectnaam en een methode mee moet sturen...

ik zou dat dan in de post doen, en dan moet je in je code iets doen als
PHP:
1
2
3
if($_POST['submit']){
    $$_POST['object']->$_POST['methode']();
}


nou heb ik t al niet zo op die variabele variabelen als $$blaat = ... maar dit lijkt me op de 1ofandere manier ook niet de mooiste oplossing...

niemand een betere??..

  • Eärendil
  • Registratie: Februari 2002
  • Laatst online: 15:34
Verwijderd schreef op donderdag 30 december 2004 @ 01:18:
PHP:
1
2
3
if($_POST['submit']){
    $$_POST['object']->$_POST['methode']();
}
Deze code is niet bepaald veilig, met deze code kan willekeurige functie van een willekeurig object aangeroepen worden (bijv. '$product->verwijder()'). Faabman bedoelde:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
if($_POST['submit']){
    switch ($_POST['object'])
    {
        case "winkelwagen":
            switch($_POST['methode']);
            {
                case "voegToe":
                    doeIets();
                    break;
                default:
                    die("ongeldige functie");
            }
            break;
        case "klant":
            switch($_POST['methode']);
            {
                case "wijzigGegevens":
                    doeIetsMetKlant();
                    break;
                default:
                    die("ongeldige functie");
            }
            break;
        default:
            die("ongeldig object");
    }
}


Als je het niet zo ingewikkeld wilt maken kan je natuurlijk ook 2 verschillende verwerkingspagina's maken.

[ Voor 20% gewijzigd door Eärendil op 30-12-2004 01:49 ]


Verwijderd

Topicstarter
op zich vind ik dit niet ingewikkeld...maar gewoon niet zo mooi. Ik noemde nu bij wijze van voorbeeld even 2 objecten en 2 methodes, maar als ik nou 30 objecten heb die elk 50 methodes kennen?....dan heb ik een switch van 3 meter lang. Das niet echt gunstig voor het overzicht. Dit moet toch makkelijker kunnen :?

  • JaQ
  • Registratie: Juni 2001
  • Laatst online: 20-09 16:59

JaQ

Verwijderd schreef op donderdag 30 december 2004 @ 01:53:
op zich vind ik dit niet ingewikkeld...maar gewoon niet zo mooi. Ik noemde nu bij wijze van voorbeeld even 2 objecten en 2 methodes, maar als ik nou 30 objecten heb die elk 50 methodes kennen?....dan heb ik een switch van 3 meter lang. Das niet echt gunstig voor het overzicht. Dit moet toch makkelijker kunnen :?
Je zou de namen van je objecten en methods in een array kunnen zetten en door deze kunnen loopen?

Egoist: A person of low taste, more interested in themselves than in me


  • Gwaihir
  • Registratie: December 2002
  • Niet online
De namen van die object->methode combinaties die vanaf de userinterface rechtstreeks aangeroepen mogen worden dan natuurlijk. Klinkt goed.

(Kun je trouwens die topic-titel nog wat bijwerken?)

[ Voor 20% gewijzigd door Gwaihir op 30-12-2004 02:27 ]


  • Eärendil
  • Registratie: Februari 2002
  • Laatst online: 15:34
Als je het allemaal in een pagina wilt verwerken, zou je ook alle mogelijke/toegestane object en functienamen in een array kunnen zetten, bijv:
PHP:
1
2
3
4
5
6
7
8
9
10
$objecten['winkelwagen'] = array('voegToe','verwijder');
$objecten['klant'] = array('wijzig','getEmail');

if(isSet($objecten[$_POST['object']]) 
{
  if(in_array($_POST['functie'], $objecten[$_POST['object']]))
  {
    doeIets();
  }
}

[ Voor 27% gewijzigd door Eärendil op 30-12-2004 02:30 ]


  • Gwaihir
  • Registratie: December 2002
  • Niet online
Hmm.. hoort een object eigenlijk niet zelf te weten en aan te geven welke van z'n methods zo publiekelijk toegankelijk zijn? Dus het array wegwerken in het object en opvragen met zoiets als:
PHP:
1
$objecten['winkelwagen'] = $winkelwagen->GivePublicMethods();

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Zowel deleten als toevoegen zouden toch publieke methodes moeten zijn. Dus op die manier afschermen werkt niet.

Doe het gewoon lekker de control structure hardcoded neerzetten, is het zinnigste wat je kunt doen hoor. Als je alles gaat ver-dynamiseren dan zie je straks door je code het bos niet meer.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Verwijderd

Topicstarter
Birdie schreef op donderdag 30 december 2004 @ 02:26:
...

(Kun je trouwens die topic-titel nog wat bijwerken?)
Ik geloof niet dat ik dit zelf kan doen... of wel?...ik heb al een bericht aan een moderator gestuurd, met een nieuwe titel...

ik had [PHP] al ingevuld, kon geen titel bedenk, dacht...ik tik eerst mn topic wel en doe daarna de titel, maar drukte weer iets te snel op submit... 8)7

  • Gwaihir
  • Registratie: December 2002
  • Niet online
Niet zozeer voor het afschermen, meer voor het uitbreidingsgemak.

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
een case statement is evengoed zo uitgebreid hoor.

een url met &action=blaat

en dan een case statement over $_GET["action"], om maar een gangbaar voorbeeldje te geven.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Als je een controller (een soort coordinator) ertussen hangt kan je precies regelen wat van een webpagina op jouw objecten aangesproken kan worden.

De controller heeft in zich een of meerdere service objecten (de objecten die jouw logica uitvoeren). En op basis van de argumenten die de controller binnenkrijgt kan hij de juiste service objecten aanspreken en eventueel de juiste views weer terug vinden.

Check mvc.

Verwijderd

Wat ik altijd een nuttige manier van dispatchen vind is methoden met een bepaalde (vaste) prefix publiek toegankelijk te maken (dwz, vanuit de UI).

Je krijgt dan iets als:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Dispatcher {

  function dispatch($method) {
    if ($action) 
      $methodname = "do_" . strtolower($action);
    else
      $methodname = "do_default";

    if (!method_exists($this, $methodname)) $methodname = "do_default";

    call_user_method($methodname, $this);
  }

  function do_default() {
    echo "Er ging iets mis!";
  }

  function do_aap() {
    echo "Aap!";
  }

  function do_noot() {
    echo "Noot!";
  }
  
  function delete_everything() {
    echo "Alles ist kaput!";
  }
}

$disp = new Dispatcher();
$disp->dispatch($_GET["method"]);


Het scheelt je de moeite van extra case analysis, en het is niet onveilig, omdat alleen bepaalde `gepubliceerde' methoden aangeroepen kunnen worden op deze manier. delete_everything is bijvoorbeeld veilig voor een kwaadwillende gebruiker.
Grijze Vos schreef op donderdag 30 december 2004 @ 03:23:
een case statement is evengoed zo uitgebreid hoor.
Ja, máár, als je een case statement gebruikt om control te switchen dan moet je publicaties op 2 plaatsen bijhouden. Namelijk in de methode zelf, en in het case statement. Min of meer dezelfde informatie bijhouden op 2 plaatsen is (naast overbodig), ook nog eens gevoelig voor fouten als de code aangepast wordt.

Op deze manier hoef je de informatie maar op één op te slaan; namelijk bij de methode zelf.

Wie zegt dat introspection niet nuttig kan zijn? :p

[ Voor 16% gewijzigd door Verwijderd op 30-12-2004 12:46 ]

Pagina: 1