Generování rout za běhu a řešení problému ohledně SEO
- fary
- Člen | 155
Mám takovýto router:
class RouterFactory
{
/** @var PageRepository */
private $pageRepository;
/**
* @param PageRepository $pageRepository
*/
public function __construct(PageRepository $pageRepository)
{
$this->pageRepository = $pageRepository;
}
/**
* @return \Nette\Application\IRouter
*/
public function createRouter()
{
$router = new RouteList();
$router[] = new Route('[<locale [a-z]{2}>/]', 'Homepage:default');
$router[] = new Route('[<locale [a-z]{2}>/]index.php', 'Homepage:default', Route::ONE_WAY);
$pages = $this->pageRepository->findAllPages();
foreach ($pages as $page) {
$router[] = new Route('[<locale [a-z]{2}>/]' . $page->slug, $page->presenter . ':' . $page->action);
}
$router[] = new Route('[<locale [a-z]{2}>/]<presenter>/<action>[/<id>]', 'Homepage:default');
return $router;
}
}
Mám to řešené takto, protože v administraci si stránky můžete pojmenovat a můžete si do nich vkládat obsah. Ke každé stránce pak musíte vždy přiřadit dvojici Presenter:action, aby bylo jasné, jaké jméno stránky patří k jakému presenteru a akci. Např. http://example.com/kontakt/ je namapován na Contact:default. Díky tomu není url anglicky, tedy http://example.com/contact/ a také nenusím každý presenter:akci routovat ručně právě pro případ, že bych chtěl mít název stránky v češtine. Dalo by se to samozřejmě udělat i tak, že bych presentery pojmenovával česky, ale to není hezké. :-)
Zajímalo by mě tedy, jestli je tento způsob generování rout v pořádku. Jak by se pak dala případně řešit situace, kdy by si uživatel existující stránku kontakt, která je namapovaná na Contact:default přejmenoval na kontakty nebo kntaktni-stranka aby si ji vyhledávače nezačali indexovat jako novou stránku, přitom by šlo vlastně o tu samou se stejným názvem. Toto myslím že řeší Route::ONE_WAY že?
- Jan Tvrdík
- Nette guru | 2595
Zajímalo by mě tedy, jestli je tento způsob generování rout v pořádku
Není, všechny ty routy vygenerované v cyklu lze nahradit jednou univerzální routou se správně napsaným globálním filtrem. Tvoje řešení špatně škáluje pro větší množství stránek.