Předávání stringu v parametru

Vojtha
Člen | 36
+
0
-

Ahoj,

potřeboval bych předávat id v odkazu, problém je, že id je ve tvaru např. „5b381571–6aba-4ea4–96bf-fddeee927ce5“, a to mi vyhazuje error:
Invalid link: Argument $id passed to App\Presenters\TripPresenter::renderDetail() must be int, string given.
Zkoušel jsem ladit nastavení routeru, ale marně, hází to pořád to samé.

Poradíte? Díky.

radekBrno
Člen | 61
+
0
-

Jak vypadá router a ta metoda renderDefault()?

Vojtha
Člen | 36
+
0
-

Toto je definice routeru:

<?php

declare(strict_types=1);

namespace App\Router;

use Nette;
use Nette\Application\Routers\RouteList;


final class RouterFactory
{
	use Nette\StaticClass;

	public static function createRouter(): RouteList
	{
		$router = new RouteList;
		$router->addRoute('[<locale=en cs|en>/]<presenter>/<action>[/<id>]', [
			'presenter' => 'Homepage',
			'action' => 'default',
			'id' => [
				Nette\Routing\Route::PATTERN => '[\s\S]*',
			],
		]);
		return $router;
	}
}

A v renderDefault() je jen čtení z DB:

public function renderDefault(): void
   {
		$this->template->tours = $this->databaseManager->getTours($this->locale);
	}
David Matějka
Moderator | 6445
+
+2
-

spise renderDetail, pravdepodobne tam mas int $id

Vojtha
Člen | 36
+
0
-

To je ono, měl jsem tam
public function renderDetail(int $id): void
Díky!

Michal Hlávka
Člen | 190
+
+2
-

Vsak ta chybova hlaska to jasne pise, vim ze uz diskuzi moc nepomuzu, ale je to tak do oci bijici, ze mi to neda si odpustit komentar. :D

MajklNajt
Člen | 471
+
+6
-

@Vojtha iba taký tip: ak začínaš implementovať UUID, možno by bolo lepšie si to konvertovať už v routeri na objekt a v renderDetail vyžadovať miesto stringu tento objekt, ja mám na jednom projekte UUID od Ramsey a router vyzerá nejak takto:

public static function createRouter(\Ramsey\Uuid\UuidFactoryInterface $uuidFactory): RouteList
    $router = new RouteList();
    $router->addRoute(
        "<presenter>[/<action>[/<id>]]",
        [
            "presenter" => "Homepage",
            "action" => "default",
            "id" => [
                Route::FILTER_OUT => fn(\Ramsey\Uuid\UuidInterface $id) => $id->toString(),
                Route::FILTER_IN => fn(string $id) => $uuidFactory->fromString($id)
            ]
        ]
    );
    return $router;
}

a potom presenter:

public function renderDetail(\Ramsey\Uuid\UuidInterface $id): void
{
	...
}

Editoval MajklNajt (28. 1. 2020 19:15)

Vojtha
Člen | 36
+
0
-

Michal Hlávka napsal(a):

Vsak ta chybova hlaska to jasne pise, vim ze uz diskuzi moc nepomuzu, ale je to tak do oci bijici, ze mi to neda si odpustit komentar. :D

To samozřejmě ano, ale nejsem zvyklý na to, co všechno nette validuje při vytváření linku. Pokud by mi to spadlo až po kliknutí na odkaz, bylo by to jasné. Takhle jsem hledal chybu jinde.