De URL class af maken

Om het niet al te langdradig te maken, ga ik niet alle code meteen mee geven.

In ieder geval hebben we nu dus 5 instantie variabelen:
uri, nodes, firstNode, lastNode, root.

Om hier getters en setters voor te maken hou je rekening met de naamgeving. Een getter begint met "get" en een setter met , je raadt het al, een "set".

Als we dus een getter voor nodes maken, doen we dus:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php

public function getNodes ()
{

  return $this->nodes;
}


?>


Als we dus een setter maken, doen we:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php

public function setNodes ($array)
{

  //$this->nodes is de instantie variabele
  // $array is een lokale variabele, welke we aan
  // $this->nodes binden


  $this->nodes = $array;
}

?>


Als we dit voor alle 5 de velden doen, krijg je dus een lange lap met 10 methods.

Nu we alle rompslomp geregeld hebben, kunnen we de daadwerkelijke logica opzetten. Om te beginnen hebben we een URI REQUEST nodig. Althans, een string die deze terug geeft. Een URI REQUEST kan namelijk leeg zijn, remember ;)

Om hier op verder te gaan, we zullen eerst het volledige adres moeten verkrijgen. Dit kunnen we opvragen met $_SERVER['PHP_SELF']. Dit geeft in ons eerdere voorbeeld zoiets als:

1. http://www.domein.nl/index.php

Omdat we die index.php niet leuk vinden, en we deze al wegfilteren door middel van de HTACCESS, gaan we dat hier ook doen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php

$index
= strrpos( $_SERVER['PHP_SELF'] , "index.php" );
$root  = substr( $_SERVER['PHP_SELF'] , -0 , $index );

?>


De $index geeft nu een positie terug vanaf waar gerekend kan worden.

$root gaat nu dus de PHP_SELF bij langs, en gaat de string opknippen vanaf het einde, tot en met de plek van wat $index geeft.

Dus:
1. http://www.domein.nl/index.php

$index = 21 ( tel maar na )
$root is dus nu de complete string vanaf het einde tot 21.

In dit geval is het dus helemaal leeg.
Maar als we nu een URL zouden opgeven zoals bijvoorbeeld deze:

2. http://www.domein.nl/artikel/nummer

Dan is onze $root dus gelijk aan : "artikel/nummer".

Zoals je kunt zien gebruik in het voorbeeld de / als scheiding. Dit kun je gewoon doen, omdat we in de .HTACCESS controleren of het hier niet om een bestand of map etc gaat, dus kunnen we de / gebruiken om onderscheid te maken tussen verschillende pagina`s.

Je kunt ook een ander teken gebruik als je wil. Bijvoorbeeld een & of een ?. Zolang het een geldig teken is, kun je het als seperator gebruiken!

Ik gebruik dus de / omdat deze gewoon het duidelijkste is.

Vervolgens gaan de $root gebruiken om te filteren met de $_SERVER['REQUEST_URI']. De REQUEST_URI methode geeft alles na de root weer. dus in ons geval bijvoorbeeld: index.php of /artikel/nummer

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php

$argument
= str_replace( $root , "" , $_SERVER['REQUEST_URI'] );

?>


Vervolgens halen we onze laatste / weg, voor de netheid:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php

$uriString
= trim( $argument , "/" );

?>


Nu hebben we een hele string welke overeen kan komen met bijvoorbeeld: nieuws/categorie/artikel

Alleen de string is niet genoeg, we willen hier een array van maken!

Een array maken van een string kan op meerdere manieren, maar omdat we een standaard seperator gebruiken ( en nogmaals, je mag hier zelf ook wat invullen ) gaan we de string opknippen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php

$nodes
= explode("/", $uriString);

?>


Dat is alles eigenlijk :D

Maar omdat we met een klasse werken, zouden we eigenlijk onze instantie variabelen moeten gebruiken.

Omdat een constructor altijd aangeroepen wordt als een object geinstantieerd ( aangemaakt wordt ), gaan we nu een method schrijven welke aangeroepen zal worden in de constructor.

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
20
21
22
23
24
25
26
27
<?php

    public function UrlDispatcher ()
    {

        // body van de constructor
        $index      = strrpos( $_SERVER['PHP_SELF'] , "index.php");
        $root       = substr( $_SERVER['PHP_SELF'] , -0 , $index );

        // Stel de instantie variabele van root in
        $this->setRoot($root);

        // Vervang de root met de huidige URI
        $argument   = str_replace( $this->getRoot() , "" ,$_SERVER['REQUEST_URI'] );

        // Maak een URI string, en strip de laatste /
        $this->setUri(trim($argument, "/"));

        // Zorg ervoor dat alle nodes in een array komen
        // de String die we gebruiken halen we op door de method getUri()

        $this->setNodes(explode("/", $this->getUri()));

        // Nu alles verder afgehandeld is, kunnen we de eerste en laatste node ophalen
        $this->createNodes();

    }


?>


De mensen die nog opletten na deze lange tutorial merken dat er een method aangeroepen wordt genaamd $this->createNodes();

Deze methode set het eerste en laatste node.
Hieronder de code:

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
20
21
22
23
24
<?php

    public function createNodes ()
    {

        // sla alle nodes op in een lokale variabele
        $nodes = $this->getNodes();

        // Controleer of $nodes een eerste rij heeft ( een array begint met 0 )
        if(isset($nodes[0]))
        {

            // Deze is nog vrij makkelijk, als er een rij is op 0, is dat onze eerste node
            $this->setFirstNode($nodes[0]);
        }


        // Gooi de array over de kop, eerste wordt laatste en vice versa
        $reversedNodes = array_reverse($nodes);

        // Lijkt raar, maar nu hebben we ook de laatste node.
        // Als er maar 1 URI string is opgegeven, krijg je dus hetzelfde resultaat als de eerste

        $this->setLastNode($reversedNodes[0]);
        
    }


?>


De uitleg staat in de code. Ik gebruik de array om door heen te lussen. Mocht je nou bijvoorbeeld veel nodes willen gebruiken, kun je ook meerdere instantie variabelen aan maken. Dit is OPTIONEEL, omdat je dit vaak niet nodig zult hebben.

En hou er rekening mee dat wanneer je dit dynamisch doet, je alsnog getters moet hebben om de waardes op te halen!

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
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php

class UrlDispatcher
{
    // optioneel
    private $node1;
    private $node2;
    private $node3;
    private $node4;
    private $node5;

    /**
     * Optionele method om gewoon alle nodes te nummeren en in de instantie variabelen te zetten
     */

    public function createNummericNodes ()
    {

        // sla alle nodes op in een lokale variabele
        $nodes = $this->getNodes();

        // Als die geset is, en $nodes[0] is aanwezig
        if(isset($nodes[0]))
        {

            // Lokale variabelen
            $string = "node";
            $counter = 1;
            
            foreach($nodes as $node)
            {

                // Creer de naam voor de instantie variabele door "node" en het huidige nummer aan elkaar
                // te plakken. Deze kun je vervolgens door $$ te gebruiken, als nieuwe naam voor je
                // variabele opgeven


                $tmp_name = $string.$counter;
                $this->$$tmp_name = $node;

                // Werk de counter bij, tel er 1 bij op
                $counter++;
            }
        }
    }

?>

« Lees de omschrijving en reacties

Inhoudsopgave

  1. HTACCES gebruiken
  2. De index.php maken
  3. De URL class schrijven
  4. De URL class af maken
  5. Ter afsluiting de code

PHP tutorial opties

 
 

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.