3

作为初级开发人员,我在与一位高级开发人员争论,他说我的路由错误且危险,可能所有请求都可以路由到 homepege,但我认为他错了,我什至对其进行了测试。他说,通过添加这个

$this->router[] = new Route('/', 'Front:Bridge:default');

低于此定义的所有路由都将被忽略,所有内容都将路由到 Front:Bridge

我认为这是 BS,因为该路线明确指出,仅将请求直接重定向到 Web 根目录到 Front:Bridge。应用程序的功能确实没有改变,但他坚持我肯定会在某处引入不可预见的错误。

整个 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;
}
4

1 回答 1

2

解决这场争论的一个好方法是从官方Nette 文档中引用。

在我们回答您的问题之前,请务必记住路线的顺序很重要:

路线的顺序很重要,因为它们是从第一个到最后一个顺序尝试的。基本规则是我们声明从最具体到最一般的路线。

接下来,回想一下路由是完全匹配的。如果有一条路线,/foo它将与请求不匹配/foo/bar。对此没有官方引用,但它是隐含的,并且可以通过测试应用程序轻松验证。

有了这些知识,让我们来看看你的建议。如果你使用这条路线:

$this->router[] = new Route('/', 'Front:Bridge:default');

你是对的。那只会匹配/。Not /foo, not/foo/bar等。由于它非常明确,因此顺序无关紧要,灾难的余地也不大。

但是,在您的代码段末尾有一条重要的路线:

$this->router[] = new Route('[<path .+>]', 'Front:Bridge:default');

这是一条与匹配不同的包罗万象的路线,可能/您的对等方真正担心的:由于它是模棱两可的(通过匹配所有路径!),这条路线的顺序肯定很重要。通过将其放在首位,所有请求都将重定向到Front:Bridge:default.

于 2018-03-08T23:09:19.863 回答