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)