Userfriendy routování uživatelů – example.com/nick

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
VojtaSim
Člen | 55
+
0
-

Zdravím,
řeším problém jak routovat uživatele podobně jako to dělá Facebook, nebo Twitter. Dosud jsem používal routu:

$router[] = new Route('profile/<nick [a-zA-Z0-9_\-\.]+>/<action>/<id>', array(
	'presenter' => 'Profile',
	'action' => 'default',
	'id' => NULL
));

Chtěl bych odstranit profile/, ale zároveň bych chtěl zachovat funkčnost výchozí routy:

$router[] = new Route('<presenter=Index>[/<action=default>]');

Zvažoval jsem použití filtrů, abych zjistil jestli daný Presenter existuje a když ne tak přesměrovat na Profile:default s parametrem <nick> (nebo opačně, jestli existuje uživatel, ale lepší prohledat 30 resenterů než 500 uživatelů), bohužel mě nenapadlo jak takový filtr vytvořit.
Na druhé straně jsem taky zvažoval použití .htaccess magie a pohrát si s RewriteCond a parametry -d a -f.

Máte někdo nějaké nápady? Přikláněl bych se k verzi s filtry, ale nevím jak.

David Matějka
Moderator | 6445
+
0
-

na htaccess bych nesahal :)

napada me vlastni routa v tomhle stylu:

use Nette;

class PresenterRoute extends Nette\Application\Routers\Route
{
	protected $presenterFactory;

	public function injectPresenterFactory(Nette\Application\IPresenterFactory $presenterFactory)
	{
		$this->presenterFactory = $presenterFactory;
	}

	public function match(Nette\Http\IRequest $httpRequest)
	{
		$request = parent::match($httpRequest);
		if($request === NULL) {
			return NULL;
		}
		try {
			$this->presenterFactory->getPresenterClass($request->getPresenterName());
		} catch(Nette\Application\InvalidPresenterException) {
			return NULL;
		}
		return $request;
	}

}

//potom do routeru budes muset:

$router[] = $route = new PresenterRoute('<presenter=Index>[/<action=default>]');
$route->injectPresenterFactory($container->getByType("Nette\Application\IPresenterFactory"));
VojtaSim
Člen | 55
+
0
-

matej21 napsal(a):

> $router[] = $route = new PresenterRoute('<presenter=Index>[/<action=default>]');
> $route->injectPresenterFactory($container->getByType("Nette\Application\IPresenterFactory"));

jen mi není jasné jak si z toho pak vytáhnu ten nick uživatele. Dát za to tu další routu, která bude routovat uživatele?

$router[] = $route = new PresenterRoute('<presenter=Index>[/<action=default>]');
$route->injectPresenterFactory($container->getByType("Nette\Application\IPresenterFactory"));

$router[] = new Route('<nick [a-zA-Z0-9_\-\.]+>/<action>[/<id [a-z0-9_]+>]', array(
	'presenter' => 'Profile',
	'action' => 'default',
	'id' => NULL
));
VojtaSim
Člen | 55
+
0
-

Taky mi nějak nedochází jak by se to dalo použít s RouterFactory (vycházím ze Sandboxu), teda jak dostat $container do služby

David Matějka
Moderator | 6445
+
0
-

jo pro uzivatele budes mit druhou routu. a jak tam dostat $container. kdyz pouzivas RouterFactory, coz je registrovany jako nette sluzba, tak bude nejlepsi nechat si poslat PresenterFactory jako zavislost, tedy nejak takhle:

use Nette,
	Nette\Application\Routers\RouteList,
	Nette\Application\Routers\Route,
	Nette\Application\Routers\SimpleRouter;

class RouterFactory
{
	protected $presenterFactory;

	public function __costruct(Nette\Application\IPresenterFactory $presenterFactory)
	{
		$this->presenterFactory = $presenterFactory;
	}

	public function createRouter()
	{
		$router = new RouteList();
		$router[] = $route = new PresenterRoute('<presenter=Index>[/<action=default>]');
		$route->injectPresenterFactory($this->presenterFactory);

		$router[] = new Route('<nick [a-zA-Z0-9_\-\.]+>/<action>[/<id [a-z0-9_]+>]', array(
    			'presenter' => 'Profile',
    			'action' => 'default',
    			'id' => NULL
		));
		return $router;
	}

}

Editoval matej21 (3. 5. 2013 20:38)

VojtaSim
Člen | 55
+
0
-

Mám problém, že po napsání URL example.ltd/NiCk to přehodí URL na example.ltd/profile?nick=NiCk
používám čistě jenom routy, které byly zmíněny výše

Obrázek rout z debug baru

Editoval VojtaSim (10. 5. 2013 14:38)

Tabetha
Člen | 140
+
0
-

prehod poradnie tých rout či to pomôže (z 2. miesta na 1. daj)

VojtaSim
Člen | 55
+
0
-

Tabetha napsal(a):

prehod poradnie tých rout či to pomôže (z 2. miesta na 1. daj)

tak to bude routovat uživatele, ale už ne normální presentery e.g. /setting