我和一位高级开发人员在一起说我的路由是错误和危险的,可能所有的请求都可能被路由到homepege,但我认为他错了,我甚至测试了它。他说通过添加这个
$this->router[] = new Route('/', 'Front:Bridge:default');
此定义下的所有路线都将被忽略,所有路线都将路由到Front:Bridge
我认为是BS,因为该路线明确指出仅重定向请求直接向Web根目录请求Front:Bridge。应用程序的功能确实没有改变,但他坚持认为我肯定会在某处引入不可见的bug。
ref的整个routerFactory
public function getRouter()
{
$this->router[] = new Route('/muj-ucet[/<action=default>]', [
'module' => 'Front',
'presenter' => 'Account',
'action' => [
Route::VALUE => 'default',
Route::FILTER_TABLE => [
'zpravy' => 'message',
'profil' => 'profile',
'objednavky' => 'orders',
'sprava-uzivatelu' => 'users'
],
],
]);
$this->router[] = new Route('/', 'Front:Bridge:default');
$this->router[] = new Route('[<lang [a-zA-Z]{2}>/]html/prihlaseni.html', 'OnlineUser:Front:Login:default');
$this->router[] = new Route('/superadmin/prihlaseni', 'OnlineUser:Front:Login:superAdminLogin');
$this->router[] = new Route('[<lang [a-zA-Z]{2}>/]html/registrace.html', 'OnlineUser:Front:Registration:default');
$this->router[] = new Route('/potvrzeni-registrace', Linker::ACTION_CONFIRM_REGISTRATION);
$this->router[] = new Route('/aktivace-uctu', Linker::ACTION_ACTIVATION_ACCOUNT);
$this->router[] = new Route('/nove-heslo', Linker::ACTION_FORGOT_PASSWORD);
$this->router[] = new Route('/logout', 'OnlineUser:Front:Login:logout');
$this->router[] = new Route('/validace/<action=default>', [
'module' => 'OnlineUser:Front',
'presenter' => 'Validation',
'action' => [
Route::VALUE => 'default',
Route::FILTER_TABLE => [
'validace-emailu' => 'validateEmailNotExists',
'validace-ico' => 'validateIcNotExists',
'validace-ico-ares-heo' => 'validateIcAresAndHeO',
],
],
]);
$this->router[] = new Route('[<path .+>]', 'Front:Bridge:default');
return $this->router;
}
答案 0 :(得分:2)
解决这场辩论的一个好方法是从官方Nette docs中引用引文。
在我们回答您的问题之前,remember the order of routes matter非常重要:
路线顺序很重要,因为它们是从第一个到最后一个顺序尝试的。基本规则是声明从最具体到最一般的路线。
接下来,请回想一下路由与完全匹配。如果有/foo
的路线,则/foo/bar
的请求不匹配。这里没有官方引用,但它暗示并且很容易通过测试应用验证。
有了这些知识,让我们来看看你的建议。如果你使用这条路线:
$this->router[] = new Route('/', 'Front:Bridge:default');
你是对的。这只会匹配/
。不是/foo
,而是/foo/bar
等等。由于它是如此明确,订单无关紧要,而且没有太大的灾难空间。
然而,在您的代码段结尾处有一条重要路线:
$this->router[] = new Route('[<path .+>]', 'Front:Bridge:default');
这是 与匹配/
不同的全能路线,可能是您的同伴实际担心的:因为它不明确(通过匹配所有路径!)这条路线的顺序肯定很重要。首先放置它,所有请求都会重定向到Front:Bridge:default
。