Routing met URL FRIENDLY structuur

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Reshad F

Reshad F

11/11/2012 20:43:05
Quote Anchor link
Hallo allemaal, Ik wil eens iets doen aan mijn 'dirty' urls die ik altijd krijg.

vb:



niet echt mooi zoals je ziet. en nu wil ik gewoon de opbouw al correct hebben en dus niet gaan kloten met htaccess en andere tooltjes..

Dus mijn vraag. hoe lossen jullie dit op? en gebruiken jullie hier een router class van een grote framework zoja welke? hebben jullie zelf een router class? tips om zelf een class te maken eventueel ook welkom.. ( gelijk een leuke OOP opdracht )
 
PHP hulp

PHP hulp

25/11/2024 19:26:42
 
Wouter J

Wouter J

11/11/2012 21:21:33
Quote Anchor link
Ik zou de $_SERVER['REQUEST_URI'] parameter gaan gebruiken. De waarde daarvan is is wat er opgevraagd wordt, bijv. /index.php/post/hello-world. Dan sloop je het /index.php gedeelte eraf en hou je /post/hello-world over => precies wat je wilt zonder htaccess.

Vervolgens kun je hieraan een controller koppelen.

Een mooi voorbeeld heeft Pim al gegeven in een ander topic: http://www.phphulp.nl/php/forum/topic/router/83492/#594215 (en alle andere reacties daaronder).


Zelf maak ik altijd gebruik van het Symfony2 framework of het Silex framework. In het laatste geval los je de routing op zo'n manier op:
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
<?php

$app
= new Silex\Application();

$app->post('/post/{slug}', function($slug) use ($app) {
    // krijg de post uit de database
    $post = ...;

    if (!$post) {
        $app->abort(404, sprintf('The post "%s" does not exists', $slug));
    }


    return $post;
});

?>



En je kan ook Symfony2 Componenten gebruiken. Met het HttpFoundation component kun je al iets moois maken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php

use Symfony\Component\HttpFoundation\Request;

$request = Request::createFromGlobals(); // maak een request gebaseerd op de $_* globals
?>

Nu hebben we een mooie $request, vervolgens kunnen we die aan iets koppelen:
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
<?php
// we bezoeken /blog/hello-world
$request->getPathInfo(); // is /blog/hello-world

if (preg_match('|/blog/(.+)|', $request->getPathInfo(), $parameters)) {
    $controller = new PostController($request);

    $result = $controller->showPostAction($parameters[1]);
}
else if ('/' == $request->getPathInfo()) {
    $controller = new WelcomeController($request);

    $result = $controller->indexAction();
}


$result->send();
?>


De controller ziet er dan zo uit:
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
<?php

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class PostController
{
    private $request;

    public function __construct(Request $request)
    {

        $this->request = $request;
    }


    protected function getRequest()
    {

        return $this->request;
    }


    public function showPostAction($slug)
    {

        // haal de post uit de database en maak er een HTML weergave van
        $post = ...;

        // maak een response
        $response = new Response($post);

        return $response;
    }
}
 
Reshad F

Reshad F

11/11/2012 22:16:51
Quote Anchor link
De manier van silex spreekt mij wel aan alleen snap ik een paar dingen niet.

wat is de post die uit mijn database moet komen? en waar/hoe komt de slug vandaan? kan ik dit gewoon met mijn eigen navigation class bijvoorbeeld bepalen?
 
Wouter J

Wouter J

11/11/2012 22:34:00
Quote Anchor link
Silex is een micro-framework. Dat betekend dat het een aantal cruciale dingen oplost op een OO manier en de rest aan jou overlaat. Merk trouwens op de de manier die ik beschreef niet echt OO is, je kan beter een controller maken en die dan aan silex koppelen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$app
= new Silex\Application();

$app->post('/blog/{slug}', 'Rf/Controller/PostController::showPost()');
?>


Lees maar eerst eens de documentatie van silex, dan hoor ik wel of er vragen zijn!
 
Reshad F

Reshad F

12/11/2012 15:31:13
Quote Anchor link
Wouter ik heb geprobeerd om de framework tegelijkertijd met mijn library te gebruiken wat resulteerde in een conflict tussen de loaders.

Hoe los jij dit probleem op? gebruik je 1 loader voor beide?? als ik beide nu gebruik krijg ik errors namelijk.


bovenstaande al opgelost.. zat een fout in mijn eigen loader :)

Overigens heb ik een tip nodig over hoe mijn file structuur te maken. ik heb het nu gewoon van de silex framework overgenomen wat er uitziet als

Afbeelding

p.s. Heb ook een directory met Controller genaamd waar ik de class PostsController heb gemaakt. hierin moet nu dus de routing in geregeld neem ik aan maar ik vind bij de documentatie van Silex meerdere manieren. welke hiervan is het beste om te gebruiken i.c.m mijn eigen navigation class?
Gewijzigd op 12/11/2012 16:05:47 door Reshad F
 
Reshad F

Reshad F

13/11/2012 19:19:26
Quote Anchor link
Ik heb vandaag weer even uurtje tijd gehad om de routing van silex door te nemen, maar ik kom er nog altijd niet helemaal uit ik heb nu het volgende:

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
<?php

        $app
= new Silex\Application();
        $app['debug'] = true;

        $app->register(new Silex\Provider\UrlGeneratorServiceProvider());

        $app->get('/web/{slug}/', function($slug) use ($app) {
                return \Controller\PostsControler::showPost();
            }
        )->
bind('home');  

        $app->run();
        
    ?>


De error die ik nu krijg ( page not found ) interesseert me niet echt maar ik wil weten wat ik hier nu precies doe. en dan bedoel ik het

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php $app->get('..') ?>


gedeelte

En wat ik niet precies kon vinden in de documentatie is wat er nu in mijn controller moet komen. Daar heb ik momenteen een class aangemaakt met de showPost() erin.
 
Wouter J

Wouter J

13/11/2012 19:59:39
Quote Anchor link
Laten we het eerst simpel aanpakken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
// index.php
$app = new Silex\Appliaction();

$app->match('/', function(Silex\Application $app) {
    return '<h1>Foobar</h1>';
});


$app->run();
?>

Wat hebben we nu gedaan? We hebben een route aangemaakt die matched met '/'. Als ik nu dus naar index.php/ ga wordt deze routing aangesproken, dat betekend dat de functie erachter wordt aangeroepen. Die geeft 'Foobar' terug waarmee '<h1>Foobar</h1>' op de pagina komt te staan.
Een controller geeft altijd de HTML/JSON/whatever content terug.

Nu gaan we het wat moeilijker maken, we gebruiken een parameter. Als we naar index.php/hello/Wouter gaan moeten we 'Hello Wouter' krijgen en als we naar index.php/hello/Reshad gaan krijgen we 'Hello Reshad', we bouwen dus eigenlijk een GET parameter in met een 'URL friendly structuur':
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
// index.php

// ...

$app->match('/hello/{name}', function($name) use ($app) {
    return '<h1>Hello '.$name.'!</h1>';
});


// ...
?>


Oké, wat heb ik nu gedaan? Wat tussen { en } staat is een parameter, het geen ertussen staat is de naam van de parameter. Deze naam vinden we terug in function($name). Silex herkent dat jij $name in de argumenten van die functie hebt geplaatst en zal daar de waarde van de name parameter stoppen. Als we naar index.php/hello/Wouter gaan zal deze route aangesproken worden met als name parameter 'Wouter'.

We zien nog iets vreemds: use ($app). Dit is een moderne methode om een variabele uit de global scope in een functie te brengen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
$a
= 'foo';

$b = function() {
    echo strtoupper($a); // gaat niet werken, $a zit in de global scope
};

$c = function() use ($a) {
    echo strtoupper($a); // werkt, met 'use (...)' hebben we $a in de function scope gebracht
};
?>


Nu weer terug. We gaan nog wat leuks doen, we gaan de route een naam geven, dat doen we met ->bind('naam_van_route') erachter te zetten.

We kunnen nog veel meer doen, als restricties opbrengen voor een parameter, dat hij bijv. alleen uit cijfers mag bestaan ('[0-9]') of dat hij NL of EN moet zijn ('(NL|EN)'). Dit doen we met de (...->assert(...)) method:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
// index.php

// ...

$app->match('/{lang}/post/{id}', function($lang, $id) use ($app) {
    // ...
})
->
assert('lang', '(NL|EN)') // of NL of EN
->assert('id', '\d+'); // alleen nummers
// ...

?>


We kunnen ook default values meegeven:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
// index.php

// ...

$app->match('/hello/{name}', function($name) use ($app) {
})
->
value('name', 'World'); // default van name parameter is World
?>


Merk op dat je verschillende HTTP requests hebt, normaal gesproken heb je een GET request. Maar als je bijv. een formulier hebt met method="post" dan krijg je naar de volgende pagina een POST request, en zo heb je er nog 2. De $app->match(...) method zal alle typen matchen, maar je kan bijv. ook alleen POST requests matchen door $app->post(...) te gebruiken, of alleen GET requests met $app->get(...).

Ga hier eerst maar eens lekker mee spelen!
En je kan ook nog de documentatie goed doorlezen, ik heb nu besproken tot en met Named Routes.
 
Reshad F

Reshad F

13/11/2012 22:17:17
Quote Anchor link
Wouter,

Dankjewel voor de duidelijke uitleg! :)

ik heb bijvoorbeeld nu dit:

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

        $app
= new Silex\Application();
        $app['debug'] = true;

        $app->match('/pages/{category}/{name}', function($category, $name) use ($app) {
            return '<h1>Hello '.$name.'! you are in ' . $category . '</h1>';
        });


        $app->run();
        
    ?>


correct me if im wrong but nu een aantal gedachtes die er rondgaan bij mij.

nu kan ik dus de category en de name dynamisch ophalen via bijvoorbeeld een class ( controller ) toch? waardoor ik een dynamische router kan maken.
en hoe zit het met bijvoorbeeld mijn navigation class? moet ik deze speciaal hiervoor aanpassen? ik heb al wel in mijn htaccess bestand aangegeven elke request via index.pho af te handelen.
Gewijzigd op 13/11/2012 22:17:47 door Reshad F
 
Wouter J

Wouter J

13/11/2012 22:57:22
Quote Anchor link
Quote:
nu kan ik dus de category en de name dynamisch ophalen via bijvoorbeeld een class ( controller ) toch? waardoor ik een dynamische router kan maken.

Deels correct.
Ja, je kan nu de gegevens dynamisch ophalen doormiddel van de parameters die in de URL staan (en eventuele andere parameters, als sessies/cookies/post-/get-variabelen).
Nee, dit gaat niet via de controller. Die functie die je nu hebt gemaakt is de controller.

Je Navigatie klasse heb je als het goed is zo gemaakt dat hij HTML code weergeeft, dat hoef je dus niet aan te passen. Het enige wat je moet veranderen is hoe je de URL opgeeft en hoe je beslist welke menus je gaat gebruiken.

Allebei de vragen zijn simpel op te lossen met Providers. Providers zijn ingebouwde 3th party software.

Nu is er een hele lijst aan providers, maar jij bent opzoek naar de Url Generator Provider (voor menu) en Doctrine Provider (database). Mochten er nog vragen zijn na het lezen van de documentatie dan hoor ik ze wel weer :)
 
Reshad F

Reshad F

14/11/2012 00:53:45
Quote Anchor link
Oke nu heb ik beide doorgenomen en ik heb een aantal vragen omtrent de url generator.

laten we als voorbeeld nemen

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$app
->get('/', function () {
    return 'welcome to the homepage';
})
->
bind('homepage');
?>


hier geef je aan dat de root iets terug geeft en deze geef je een bind mee ( ik neem aan dat dit dezelfde werking heeft als bij PDO bijvoorbeeld )
waar je de "werking" pas later mee geeft in dit geval.

verder heb je daarna bijvoorbeeld

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$app
->get('/hello/{name}', function ($name) {
    return "Hello $name!";
})
->
bind('hello');
?>


wat dus gebind wordt aan hello. wat ik nu niet snap hieraan is hoe weet je straks waar de {name} vandaan moet komen aangezien je alleen de hello gedeelte bind.

en voor deel 2 van de vraag komt het volgende voorbeeldje bij kijken

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$app
->get('/navigation', function () use ($app) {
    return '<a href="'.$app['url_generator']->generate('homepage').'">Home</a>'.
           ' | '.
           '<a href="'.$app['url_generator']->generate('hello', array('name' => 'Igor')).'">Hello Igor</a>';
});

?>


dit laatste stukje is toch veel te statisch volgens mij en eerlijk gezegd begrijp ik dit ook niet helemaal. ik snap dat het de bindings afhandelt maar verder ook niet.
stel nou dat je een hele dynamische content hebt dan moet je dus voor elk mogelijke url een binding aanmaken of denk ik nu iets anders dan bedoelt?

de Doctrine heb ik geen vragen over. die is wel duidelijk genoeg.

verder nog even terug blikkend op jou laatste post.. hoe bedoel je met hoe ik beslis welke menus ik ga gebruiken?
Gewijzigd op 14/11/2012 00:55:45 door Reshad F
 
Reshad F

Reshad F

16/11/2012 09:30:41
Quote Anchor link
*bump*
 
Reshad F

Reshad F

25/11/2012 22:57:12
Quote Anchor link
WouterJ ik heb ongeacht veel voorbeeldjes op het internet te lezen en de voorbeeldjes van silex zelf bestudeert te hebben niet uitgekomen op het antwoord: Hoe regel ik dit dynamisch. Dus 1x de routing aanmaken en ervoor zorgen dat ik er nooit meer aan hoef te zitten.

ik ben nu ongeveer op zoiets uitgekomen.. maar ik weet niet hoe ik precies de query goed toepas d.m.v. de ORM.. heb jij misschien een voorbeeldje/uitleg waar ik verder mee kom?

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
    $app
= new Silex\Application();
    $app['debug'] = false;

    $app->register(new Silex\Provider\UrlGeneratorServiceProvider());

    $app->register(new Silex\Provider\DoctrineServiceProvider(), array(
        'db.options' => array(
            'dbname' => 'testData',
            'user' => 'root',
            'password' => 'root',
            'host' => 'localhost',
            'driver' => 'pdo_mysql',
        ),
    ));


    $app->match('/', function() {

            return 'homepage';

    });


    $app->match('/{slug}', function($slug) use ($app) {

        $sql = "SELECT * FROM pages WHERE slug = ?";

        $post = $app['db']->fetchAssoc($sql);

        if (!$post) {
                $app->abort(404, sprintf('The page "%s" does not exists', $slug));
           }

           else {
               // wat nu hier??!
           }

          return $post;

    });


    $app->run();
?>
 
Wouter J

Wouter J

25/11/2012 23:02:46
Quote Anchor link
Quote:
$post = $app['db']->fetchAssoc($sql);

Dit heb je nergens kunnen lezen... Tevens als je even logisch nadenkt: Hoe moet doctrine nou weten wat je op de plaats van de ? wilt hebben? Dit moet je aangeven in een array als 2e argument.

Quote:
// wat nu hier??!

Een controller (die functie dus) moet altijd HTML code teruggeven, maak hier dus je HTML code op met de data van de $post en doe er wat leuks mee.
 
Reshad F

Reshad F

26/11/2012 20:05:42
Quote Anchor link
na weer verder te zoeken kwam ik een hele mooi gedocumenteerd pdf tegen van Silex waar het een en ander iets uitgebreider werd uitgelegd.

Nog steeds heb ik alleen het probleem dat ik een aantal dingen niet snap, Laat ik eerst maar is mijn code geven en dan de problems opsommen.

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?php
    $app
= new Silex\Application();
    $app['debug'] = false;

    $app->register(new Silex\Provider\UrlGeneratorServiceProvider());

    $app->register(new Silex\Provider\DoctrineServiceProvider(), array(
        'db.options' => array(
            'dbname' => 'testData',
            'user' => 'root',
            'password' => 'root',
            'host' => 'localhost',
            'driver' => 'pdo_mysql',
        ),
    ));


    $app->match('/', function() {

            return 'homepage';

    });


    $pages = array(
        1 => array(
            'date'      => '2012-03-29',
            'author'    => 'Jantje',
            'title'     => 'Using Silex',
            'body'      => '...',
            ),

        2 => array(
            'date'        => '2012-03-29',
            'author'    => 'reshad',
            'title'        => 'Reshad post',
            'body'        => 'dit is de body dan..',
            ),
    );


    $app->get('/pages/', function () use ($pages) {
        $output = '';
        foreach ($pages as $post) {
            $output .= $post['title'];
            $output .= '<br />';
    }

        return $output;
    });


    $app->get('/pages/show/{id}', function (Silex\Application $app, $id) use ($pages) {
    if (!isset($pages[$id])) {
        $app->abort(404, "Post $id does not exist.");
    }

    $post = $pages[$id];
    return  "<h1>{$post['title']}</h1>".
            "<p>{$post['body']}</p>";
    });


    $app->run();
?>


en hier komen de vragen.

1. ik heb in het stukje waar je kijkt of je in de root van je website bent ( dit stuk als vb ) nu staan dat er een string teruggegeven wordt. Hoe kan ik nu het beste html erin verwerken? gewoon de php openen/sluiten of alles in een variabele zetten en deze in 1 keer teruggeven?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
    $app
->match('/', function() {

            return 'homepage';

    });

?>


2. in het volgende stukje heb ik bijvoorbeeld nu aparte pagina's maar om hier nu id's te laten zien is niet echt netjes ( www.domein.nl/web/pages/show/2 )
ik kom hier nu niet uit hoe ik dit kan veranderen zodat ik de titel van mijn pagina krijg.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
$app
->get('/pages/show/{id}', function (Silex\Application $app, $id) use ($pages) {
    if (!isset($pages[$id])) {
        $app->abort(404, "Post $id does not exist.");
    }

    $post = $pages[$id];
    return  "<h1>{$post['title']}</h1>".
            "<p>{$post['body']}</p>";
    });

?>


en de laatste vraag..

3. Kan ik hier gewoon PDO blijven gebruiken i.c.m Silex om de juiste content op te halen of is het beter om een ORM te gebruiken zoals Silex documenteert? en zoja voor de 2e.. ik kan geen goede tutorial/documentatie vinden over het gebruik van Doctrine met Silex weet jij er een misschien.. of een voorbeeldje?

Alvast bedankt! :)

Toevoeging op 26/11/2012 20:08:25:

na weer verder te zoeken kwam ik een hele mooi gedocumenteerd pdf tegen van Silex waar het een en ander iets uitgebreider werd uitgelegd.

Nog steeds heb ik alleen het probleem dat ik een aantal dingen niet snap, Laat ik eerst maar is mijn code geven en dan de problems opsommen.

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?php
    $app
= new Silex\Application();
    $app['debug'] = false;

    $app->register(new Silex\Provider\UrlGeneratorServiceProvider());

    $app->register(new Silex\Provider\DoctrineServiceProvider(), array(
        'db.options' => array(
            'dbname' => 'testData',
            'user' => 'root',
            'password' => 'root',
            'host' => 'localhost',
            'driver' => 'pdo_mysql',
        ),
    ));


    $app->match('/', function() {

            return 'homepage';

    });


    $pages = array(
        1 => array(
            'date'      => '2012-03-29',
            'author'    => 'Jantje',
            'title'     => 'Using Silex',
            'body'      => '...',
            ),

        2 => array(
            'date'        => '2012-03-29',
            'author'    => 'reshad',
            'title'        => 'Reshad post',
            'body'        => 'dit is de body dan..',
            ),
    );


    $app->get('/pages/', function () use ($pages) {
        $output = '';
        foreach ($pages as $post) {
            $output .= $post['title'];
            $output .= '<br />';
    }

        return $output;
    });


    $app->get('/pages/show/{id}', function (Silex\Application $app, $id) use ($pages) {
    if (!isset($pages[$id])) {
        $app->abort(404, "Post $id does not exist.");
    }

    $post = $pages[$id];
    return  "<h1>{$post['title']}</h1>".
            "<p>{$post['body']}</p>";
    });


    $app->run();
?>


en hier komen de vragen.

1. ik heb in het stukje waar je kijkt of je in de root van je website bent ( dit stuk als vb ) nu staan dat er een string teruggegeven wordt. Hoe kan ik nu het beste html erin verwerken? gewoon de php openen/sluiten of alles in een variabele zetten en deze in 1 keer teruggeven?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
    $app
->match('/', function() {

            return 'homepage';

    });

?>


2. in het volgende stukje heb ik bijvoorbeeld nu aparte pagina's maar om hier nu id's te laten zien is niet echt netjes ( www.domein.nl/web/pages/show/2 )
ik kom hier nu niet uit hoe ik dit kan veranderen zodat ik de titel van mijn pagina krijg.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
$app
->get('/pages/show/{id}', function (Silex\Application $app, $id) use ($pages) {
    if (!isset($pages[$id])) {
        $app->abort(404, "Post $id does not exist.");
    }

    $post = $pages[$id];
    return  "<h1>{$post['title']}</h1>".
            "<p>{$post['body']}</p>";
    });

?>


en de laatste vraag..

3. Kan ik hier gewoon PDO blijven gebruiken i.c.m Silex om de juiste content op te halen of is het beter om een ORM te gebruiken zoals Silex documenteert? en zoja voor de 2e.. ik kan geen goede tutorial/documentatie vinden over het gebruik van Doctrine met Silex weet jij er een misschien.. of een voorbeeldje?

Alvast bedankt! :)

Toevoeging op 26/11/2012 20:08:25:

na weer verder te zoeken kwam ik een hele mooi gedocumenteerd pdf tegen van Silex waar het een en ander iets uitgebreider werd uitgelegd.

Nog steeds heb ik alleen het probleem dat ik een aantal dingen niet snap, Laat ik eerst maar is mijn code geven en dan de problems opsommen.

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?php
    $app
= new Silex\Application();
    $app['debug'] = false;

    $app->register(new Silex\Provider\UrlGeneratorServiceProvider());

    $app->register(new Silex\Provider\DoctrineServiceProvider(), array(
        'db.options' => array(
            'dbname' => 'testData',
            'user' => 'root',
            'password' => 'root',
            'host' => 'localhost',
            'driver' => 'pdo_mysql',
        ),
    ));


    $app->match('/', function() {

            return 'homepage';

    });


    $pages = array(
        1 => array(
            'date'      => '2012-03-29',
            'author'    => 'Jantje',
            'title'     => 'Using Silex',
            'body'      => '...',
            ),

        2 => array(
            'date'        => '2012-03-29',
            'author'    => 'reshad',
            'title'        => 'Reshad post',
            'body'        => 'dit is de body dan..',
            ),
    );


    $app->get('/pages/', function () use ($pages) {
        $output = '';
        foreach ($pages as $post) {
            $output .= $post['title'];
            $output .= '<br />';
    }

        return $output;
    });


    $app->get('/pages/show/{id}', function (Silex\Application $app, $id) use ($pages) {
    if (!isset($pages[$id])) {
        $app->abort(404, "Post $id does not exist.");
    }

    $post = $pages[$id];
    return  "<h1>{$post['title']}</h1>".
            "<p>{$post['body']}</p>";
    });


    $app->run();
?>


en hier komen de vragen.

1. ik heb in het stukje waar je kijkt of je in de root van je website bent ( dit stuk als vb ) nu staan dat er een string teruggegeven wordt. Hoe kan ik nu het beste html erin verwerken? gewoon de php openen/sluiten of alles in een variabele zetten en deze in 1 keer teruggeven?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
    $app
->match('/', function() {

            return 'homepage';

    });

?>


2. in het volgende stukje heb ik bijvoorbeeld nu aparte pagina's maar om hier nu id's te laten zien is niet echt netjes ( www.domein.nl/web/pages/show/2 )
ik kom hier nu niet uit hoe ik dit kan veranderen zodat ik de titel van mijn pagina krijg.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
$app
->get('/pages/show/{id}', function (Silex\Application $app, $id) use ($pages) {
    if (!isset($pages[$id])) {
        $app->abort(404, "Post $id does not exist.");
    }

    $post = $pages[$id];
    return  "<h1>{$post['title']}</h1>".
            "<p>{$post['body']}</p>";
    });

?>


en de laatste vraag..

3. Kan ik hier gewoon PDO blijven gebruiken i.c.m Silex om de juiste content op te halen of is het beter om een ORM te gebruiken zoals Silex documenteert? en zoja voor de 2e.. ik kan geen goede tutorial/documentatie vinden over het gebruik van Doctrine met Silex weet jij er een misschien.. of een voorbeeldje?

Alvast bedankt! :)
 
Wouter J

Wouter J

26/11/2012 22:20:47
Quote Anchor link
Quote:
1. ik heb in het stukje waar je kijkt of je in de root van je website bent ( dit stuk als vb ) nu staan dat er een string teruggegeven wordt. Hoe kan ik nu het beste html erin verwerken? gewoon de php openen/sluiten of alles in een variabele zetten en deze in 1 keer teruggeven?

Je kan het allemaal in een variabele opslaan, je kan ook een template maken en een template engine als Twig gebruiken (zie de TwigProvider voor meer informatie)

Quote:
2. in het volgende stukje heb ik bijvoorbeeld nu aparte pagina's maar om hier nu id's te laten zien is niet echt netjes ( www.domein.nl/web/pages/show/2 )
ik kom hier nu niet uit hoe ik dit kan veranderen zodat ik de titel van mijn pagina krijg.

Sowieso is pages/show/2 is niet mooi en zou ik er post/2 van maken. En als je het id wilt veranderen, pas de route aan, geef een andere parameter mee aan de functie en pas je zoektocht in de array aan zodat je kunt selecteren op titel.

Quote:
3. Kan ik hier gewoon PDO blijven gebruiken i.c.m Silex om de juiste content op te halen of is het beter om een ORM te gebruiken zoals Silex documenteert?

Je mag het doen zoals jij het wilt.
 



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.