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

- VojtaSim
 - Člen | 55
 
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
 
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
 
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
));
				
- David Matějka
 - Moderator | 6445
 
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
 
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
Editoval VojtaSim (10. 5. 2013 14:38)