如何在Symfony中检查绝对路径/路由?

时间:2017-08-24 21:52:10

标签: symfony curl routing routes symfony-routing

首先,感谢您抽出时间来解决这个难题。

目标:

我的网址结构类似于facebook / twitter:site.com/Username

要让用户设置用户名,我需要检查路由的路径是否与用户名匹配。

可能性&问题:

如果有人感兴趣,我想出了可能的解决方案:

1。)使用getRouteCollection()

问题:不应该使用此方法,因为它会重建路由缓存并导致性能下降(请参阅https://github.com/symfony/symfony-docs/issues/6710

2。)在用户(用户名)实体中使用黑名单作为RegExp将所有网站列入黑名单,例如"设置","关于","登录" ,"注册" ...

* @Assert\Regex(pattern="/^(?!register)(?!login)...

问题:这几乎可以保证爆炸,因为有时忘记将URL添加到此RegExp中

3.使用CURL检查site.com/username是否会产生404

问题:这似乎是一个" hack"对我和不专业。

问题:

什么是专业,安全的检查路线是否已经存在的方式,这样就可以设置用户名并保证"免费" (通过像site.com/Username这样的绝对路径,没有其他途径可以了吗?

例如$ app-> hasURL(' / username')

1 个答案:

答案 0 :(得分:2)

添加:use \Symfony\Component\RoutingException\ResourceNotFoundException;

然后,$router是路由服务,您可以尝试将URL与路由匹配。如果它不匹配任何东西,它将抛出一个异常,但是如果你有一个默认的catch-all路由它总是匹配的东西,所以你需要检测它是否匹配catch-all:

$routeIsAvailable = false;

try {
    $route = $router->match( '/' . $username );

    // If you are using a catch-all route to load profiles
    if ( $route[ '_route' ] === 'name_of_catch_all_route' )
        $routeIsAvailable = true;

} catch ( ResourceNotFoundException ) {

    // If the url didn't match any route at all
    $routeIsAvailable = true;
}

请确保先验证$username,以使其不包含?/等字符。您也可以urlencode,但您可能不希望用户的个人资料网址中包含编码字符,因此最好只限制有效的用户名。