首先,感谢您抽出时间来解决这个难题。
目标:
我的网址结构类似于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')
答案 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
,但您可能不希望用户的个人资料网址中包含编码字符,因此最好只限制有效的用户名。