Routování v rámci scriptu, bez HTTP požadavku
- pux
- Člen | 14
Zkouším si napsat „vlastní router“, abych byl schopný v rámci backendu převést nějakou „adresu“ na klasickou trojkombinaci presenter:action:id, resp. protože nepoužívám v tomto případě Nette Application, tak aby mi to vrátilo třídu, metodu a parametr. Můj router:
$router = new Nette\Routing\RouteList;
$router->addRoute('article/[/<id>]', [
'presenter' => [
Nette\Routing\Route::VALUE => 'ArticleClass',
],
'action' => [
Nette\Routing\Route::VALUE => 'default',
],
'id' => [
Nette\Routing\Route::PATTERN => '\d+',
],
]);
return $router;
Poté se snažím vytvořit falešný Request
, abych mohl na
routeru zavolat match()
:
$fakeUrl = new Nette\Http\Url();
$fakeUrl->setScheme('https');
$fakeUrl->setHost('localhost');
$fakeUrl->setPath($url);
$uri = new Nette\Http\UrlScript($fakeUrl);
$httpRequest = new Nette\Http\Request($uri);
var_dump($this->router->match($httpRequest));
Když zkusím do $url
dosadit article, dumpne mi to
(dle očekávání):
array(3) {
["presenter"]=>
string(12) "ArticleClass"
["action"]=>
string(7) "default"
["id"]=>
NULL
}
Pokud ale zadám article/123, nematchne to nic a dump je
null
.
Přehlížím něco, co mi brání v propojení oné „adresy“ s routou? Nebo existuje nějaká efektivnější cesta, jak bez Nette Application (pouze z Nette/Routing) docílit stejného chování routeru, jako ve fullstack frameworku?
- pux
- Člen | 14
David Matějka napsal(a):
v masce máš dvakrát za sebou lomítko –
article/[/<id>]
Díky, překlep. Nicméně i tak, když to opravím:
$router = new Nette\Routing\RouteList;
$router->addRoute('article[/<id>]', [
'presenter' => [
Nette\Routing\Route::VALUE => 'ArticleClass',
],
'action' => [
Nette\Routing\Route::VALUE => 'default',
],
'id' => [
Nette\Routing\Route::PATTERN => '\d+',
],
]);
return $router;
Pořád mi to nic nematchne. Dump mého fake UrlScript
je:
object(Nette\Http\UrlScript)#84 (11) {
["scriptPath":"Nette\Http\UrlScript":private]=>
string(12) "/article/123"
["basePath":"Nette\Http\UrlScript":private]=>
string(9) "/article/"
["scheme":"Nette\Http\UrlImmutable":private]=>
string(5) "https"
["user":"Nette\Http\UrlImmutable":private]=>
string(0) ""
["password":"Nette\Http\UrlImmutable":private]=>
string(0) ""
["host":"Nette\Http\UrlImmutable":private]=>
string(9) "localhost"
["port":"Nette\Http\UrlImmutable":private]=>
NULL
["path":"Nette\Http\UrlImmutable":private]=>
string(12) "/article/123"
["query":"Nette\Http\UrlImmutable":private]=>
array(0) {
}
["fragment":"Nette\Http\UrlImmutable":private]=>
string(0) ""
["authority":"Nette\Http\UrlImmutable":private]=>
string(9) "localhost"
}
//EDIT: Pro situaci, kdy za $url
z prvního
scriptu dosadím article/123
.
Editoval pux (5. 4. 2021 8:57)
- David Matějka
- Moderator | 6445
jo tam bude asi problém s basePath, zkus zadat druhý parametr UrlScript
$uri = new Nette\Http\UrlScript($fakeUrl, '/');