如何在 Symfony 中检查绝对 paths/routes?

How to check for absolute paths/routes in Symfony?

首先感谢您花时间解决这个困难的话题。

目标:

我的 URL 结构就像 facebook/twitter: site.com/Username

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

可能性与问题:

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

1.) 使用 getRouteCollection()

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

2.) 在用户(用户名)实体中使用黑名单作为 RegExp 将所有站点列入黑名单,如 "settings"、"about"、"login"、"register"。 ..

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

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

3.) 使用 CURL 来检查站点。com/username 是否导致 404

问题:这对我来说似乎是"hack",不专业。

问题:

检查路由是否不存在的专业、安全的方法是什么,以便可以设置用户名并保证为 "free"(通过像 site.com/Username 这样的绝对路径并且没有其他路径)?

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

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

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

$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 它,但您可能不希望您的用户个人资料 url 中包含编码字符,因此最好只限制有效的用户名。