[PHP] Verbetering structuur

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben nu al een tijdje bezig met programmeren in PHP en heb een begin gemaakt aan een CMS (het staat nog heel erg in de kinderschoenen en het is meer een probeersel voor 'training' van mij zelf).

In het adminscherm heb ik een menustructuur opgebouwd met daarin bv. het kopje Nieuwsberichten.
De link naar nieuwsberichten is dan als volgt: nieuwsberichten.php?cmd=1.

Nieuwsberichten.php via een switch statement opgebouwd en wel als volgt:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
switch($_GET['cmd']) {
    case 1 : {
         /* hier wordt een overzicht van nieuwsberichten geprint
            achter elk bericht staan 2 icoontjes nml:
            bewerken: nieuwsberichten.php?cmd=2
            verwijderen: nieuwsberichten.php?cmd=6
            onderaan staat nog een knopje met toevoegen nieuwsberichten.php?cmd=4
         */
    } break;
    case 2: {
        /* bewerken
            een formulier wordt opgebouwd met daarin de waardes weergegeven
            dit formulier wordt gepost naar case 3
       */
    } break; 
    case 3: { 
        /*
             update query maken en uitvoeren
       */
    } break;
   // voor toevoegen werkt het hetzelfde, 1 case voor het formulier 1 voor de query
}


Oke, goed het werkt.
Er is maar 1 bestand nodig voor elke soort bewerking (nieuwsberichten, gebruikers, ..).
Maar toch heb ik het gevoel dat het beter en bovenal overzichtelijker kan, de switches beginnen op te lopen tot ontzettende lappen met code wat de leesbaar- en aanpasbaarheid niet echt ten goede komt.

Wat ik dus vraag zijn wat ideeen of suggesties, hoe pakken jullie zoiets aan?

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Meestal gooi ik dan de code die specifiek is voor de verschillende cases in de switch in aparte bestanden met een herkenbare naam die ik include op basis van de switch. Een andere mogelijkheid is het onderbrengen van alle functionaliteit in functies. In de switch hoef je dan alleen de juiste functies aan te roepen per geval.

Een idee hoe dat er dan uitziet:
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
33
34
35
36
<?php
include 'inc/config.php';
include 'inc/mod.files.php';

//handle URLS

switch ($_URL[0])
{
    case 'browse'       :   $title = 'File manager';
                            $include = 'script/file_browse.php';
                        break;
    case 'categories'   :   $title = 'Directory manager';
                            $include = 'script/file_categories.php';
                        break;
    case 'details'      :   $title = 'File details';
                            $include = 'script/file_details.php';
                        break;
    case 'search'       :   $title = 'Search files';
                            $include = 'script/file_search.php';
                        break;
    case 'update'       :   $title = 'Update file';
                            $include = 'script/file_update.php';
                        break;
    case 'upload'       :   $title = 'Upload file';
                            $include ='script/file_upload.php';
                        break;
    default             : header("location: " .$base .'files/browse/');
                    
}

include 'inc/contentstart.php';

include $include;

include 'inc/footer.php';
?>

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
je kunt in zo'n switch toch gewoon weer losse functiecalls doen? ben je mooi van je switch-lap af. Verder nog een paar puntjes:
• als $_GET['cmd'] niet gezet is krijg je een Notice...niet erg mooi, tis beter om GET-vars op deze manier binnen te halen:
code:
1
$cmd =  isset($_GET['cmd']) ? $_GET['cmd'] : NULL;


• alleen jij weet dat 2 bewerken is. gebruik definities ipv harde getallen voor constanten:

code:
1
2
3
4
define("CMD_EDIT" , 2);
..
..
case CMD_EDIT:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Oke bedankt voor de tip, maar dat van die $_GET[] afvangen deed ik al, mijn voorbeeld was alleen ter schetsing van de huidige situatie :)

Acties:
  • 0 Henk 'm!

  • Rotjeknor
  • Registratie: April 2001
  • Laatst online: 01-04-2023
Ik gebruik globaal eenzelfde structuur, maar iets anders:

Elke pagina heeft bij mij een ?action=edit oid. Globaal moeten er 2 dingen gebeuren: data moet afgehandeld worden en er moet iets op het scherm komen. Daarom heb ik 2 globale switches die door dezelfde $action wordt afgehandeld (code is verkort):
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
function handle_pre_display($action)
{
  switch($action)
  {
    case 'add':
      handle_add();
      break;
    case 'add_perform':
      handle_add_perform();
      break;
  }
}

function handle_display($action)
{
  switch ($action)
  {
    case 'add':
      display_add();
      break;
    case 'add_perform':
      display_add_perform();
      break;
  }
}

Ook Knor is aangestoken met het ligfietsvirus!


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

T-MOB: Waarom altijd zo'n lastig te maintainen switch ipv een mooie array met alle info die je nodig hebt?

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$commands = array
(
    'browse'     => array('File manager', 'script/file_browse.php'),
    'categories' => array('Directory manager', 'script/file_categories.php'),
    'details'    => array('File details', 'script/file_details.php'),
    // ...
);

$url = $_URL[0];
if (isset ($commands[$url])
{
    $title = $commands[$url][0];
    include 'inc/contentstart.php';
    include $commands[$url][1];
    include 'inc/footer.php';
}


Extra pagina's toevoegen is dan simpelweg een element toevoegen aan de array ipv extra code schrijven in een switch statement. Je zou zelfs class instances of functiepointers in de array kunnen stoppen en die aanroepen

[ Voor 18% gewijzigd door .oisyn op 08-06-2005 14:58 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Ik maak zelf gebruik van de Model-View-Controller architectuur waarbij ik voor iedere actie een controller class instantieer en ik de run() functie aanroep. Dit gebeurt vanuit een bestandje die op deze manier wordt aangeroepen: action.php5?handler=ActieOfPaginaNaam. In dat script doe ik dan zoiets als dit:
PHP:
1
2
3
$controllerClass = $_GET['handler'] . "Controller";
$controller = new $controllerClass();
$controller->run();

Uiteraard is het niet zo simpel als dit, ik doe nog check op de input en beveiliging/rechten etc. maar hier komt het wel op neer. Ik maak dan overigens gebruik van __autoload() zodat de juiste class wordt geinclude.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dit vind ik wel een hele mooie oplossing daar ga ik eens wat beter naar kijken. :*)

Verder heb ik me nog niet echt beziggehouden met OO-Programmeren in PHP, ik zit mn code nog eens te lezen en doe er denk ik verstandig aan een database-class te schrijven, aangezien de meeste ruimte in wordt genomen door queries, en afhandeling daarvan.

Bedankt voor de input to dusver mensen :)

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
.oisyn schreef op woensdag 08 juni 2005 @ 14:55:
T-MOB: Waarom altijd zo'n lastig te maintainen switch ipv een mooie array met alle info die je nodig hebt?

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$commands = array
(
    'browse'     => array('File manager', 'script/file_browse.php'),
    'categories' => array('Directory manager', 'script/file_categories.php'),
    'details'    => array('File details', 'script/file_details.php'),
    // ...
);

$url = $_URL[0];
if (isset ($commands[$url])
{
    $title = $commands[$url][0];
    include 'inc/contentstart.php';
    include $commands[$url][1];
    include 'inc/footer.php';
}


Extra pagina's toevoegen is dan simpelweg een element toevoegen aan de array ipv extra code schrijven in een switch statement. Je zou zelfs class instances of functiepointers in de array kunnen stoppen en die aanroepen
Daar zit wel wat in. Alhoewel ik de switch persoonlijk overzichtelijker vind. Zeker wanneer het aantal parameters in een case toeneemt wordt een array lastiger leesbaar. Wat was $commands[$url][13] ook al weer? Dat is wel op te lossen met een associatief array, maar dan wordt het array net zo slecht te onderhouden als de switch.

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
T-MOB schreef op woensdag 08 juni 2005 @ 15:10:
Dat is wel op te lossen met een associatief array, maar dan wordt het array net zo slecht te onderhouden als de switch.
Tot je besluit om in de volgende versie toch maar een database te gebruiken om de te serveren file in te zetten. Ga dan maar eens die ultiem uitgebreide switch() in een database stoppen of er uit halen. ;)

Acties:
  • 0 Henk 'm!

  • wustenveld
  • Registratie: Februari 2002
  • Laatst online: 07-07 13:36
Ik zou zelf elk bestanden (nieuws/gebruikers enzovoorts) van eenzelfde structuur voorzien en als class in elkaar zetten. En in het script waarin je bepaald wat ie moet gaan doen zoiets zetten

call_user_func($module,$_GET['functie']);

$module is in dit geval de geïnitieerde class.
Scheelt je weer een enorm switch statement :)
Pagina: 1