Routing met URL FRIENDLY structuur
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 )
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)
En je kan ook Symfony2 Componenten gebruiken. Met het HttpFoundation component kun je al iets moois maken:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
use Symfony\Component\HttpFoundation\Request;
$request = Request::createFromGlobals(); // maak een request gebaseerd op de $_* globals
?>
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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();
?>
// 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)
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
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;
}
}
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;
}
}
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?
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:
Lees maar eerst eens de documentatie van silex, dan hoor ik wel of er vragen zijn!
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$app = new Silex\Application();
$app->post('/blog/{slug}', 'Rf/Controller/PostController::showPost()');
?>
$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!
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
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
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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();
?>
$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
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
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();
?>
// 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)
1
2
3
4
5
6
7
8
9
10
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>';
});
// ...
?>
// 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)
1
2
3
4
5
6
7
8
9
10
11
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
};
?>
$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)
We kunnen ook default values meegeven:
Code (php)
1
2
3
4
5
6
7
8
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
?>
// 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.
Dankjewel voor de duidelijke uitleg! :)
ik heb bijvoorbeeld nu dit:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
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();
?>
$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
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 :)
laten we als voorbeeld nemen
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$app->get('/', function () {
return 'welcome to the homepage';
})
->bind('homepage');
?>
$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)
1
2
3
4
5
6
2
3
4
5
6
<?php
$app->get('/hello/{name}', function ($name) {
return "Hello $name!";
})
->bind('hello');
?>
$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)
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
*bump*
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)
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
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();
?>
$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();
?>
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.
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)
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
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();
?>
$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?
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)
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)
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
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();
?>
$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?
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)
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)
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
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();
?>
$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?
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)
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! :)
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.
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.