Routovani na mobilni verzi
- stanley
- Člen | 22
Ahoj, potreboval bych poradit s jednoduchym routovacim ukolem:
Mam fungujici web www.example.com, ke kteremu chci vyrobit mobilni verzi
m.example.com.
Chtel bych, aby aktualne existujici routy fungovaly na obou subdomenach (tj.
abych nemusel zdvojnasobovat pocet rout) a abych nemusel specifikovat na jake
domene (example.com) to ma byt – jednou je to totiz domena na localhostu,
jednou na vyvojovem serveru, jednou na produkcnim serveru a neni v mych silach
to pokazde prepisovat.
Uplne by stacilo, kdyby se v pripade m.example.com nastavil nejaky parametr
isMobile na true a v pripade www.example.com na false a pak se zacaly resit
konkretni routy.
Teoreticky bych mohl soucasnou routu (napr.)
$router[] = new Route('<presenter>/<action>', array(
'presenter' => 'Default',
'action' => 'default',
))
prepsat na
$router[] = new Route('//<subdomain (www\.|m\.)><domain>/<presenter>/<action>', array(
'presenter' => 'Default',
'action' => 'default',
))
ale pripada mi dost nestastne ukladat domenu do parametru (a abych si nekomplikoval zivot, muselo by se jednat o persistentni parametr). Diky za rady.
- Filip Procházka
- Moderator | 4668
Proč by to mělo být nešťastné? Mně to příjde jako velice dobré řešení.
$router[] = new Route('//[!<subdomain (www|m)>].[!<domain>]/<presenter>/<action>', array(
'subdomain' => 'www',
'domain' => "example.com",
'presenter' => 'Default',
'action' => 'default',
));
+persistentní parametry
nebo :
class BasePresenter extends Nette\Application\Presenter
{
/** @var bool */
private $isMobile;
protected function startup()
{
parent::startup();
$host = Nette\Environment::getHttpRequest()->uri->host;
$domainMap = (object)Nette\String::match($host, '~^(?:(?P<second>[^.]+)+\.)?(?P<domain>(?P<top>[^.]+)\.(?P<tld>[^.]+))$~i');
$this->isMobile = $domainMap->second === 'm';
}
/**
* @return bool
*/
public function isMobile()
{
return $this->isMobile;
}
// ...
}
a nebo ještě čistěji, si můžeš upravit HttpRequestFactory
a HttpRequest
a přidat si do něj podporu pro identifikaci
mobilních zařízení.
a nemusíš předělávat routy… :)
V každém případě by to chtělo nějak ve startup kontrolovat jestli je zařízení mobil (ideálně pomocí hlaviček) a následně přesměrovat na mobilní verzi.