Routování v rámci scriptu, bez HTTP požadavku

pux
Člen | 14
+
0
-

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?

David Matějka
Moderator | 6445
+
0
-

v masce máš dvakrát za sebou lomítko – article/[/<id>]

pux
Člen | 14
+
0
-

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
+
+1
-

jo tam bude asi problém s basePath, zkus zadat druhý parametr UrlScript

$uri = new Nette\Http\UrlScript($fakeUrl, '/');
pux
Člen | 14
+
0
-

@DavidMatějka pecka, díky. K čemu to tam je? Pro případ, že by byla nějaká předpona před samotným webem?