2017-08-24 10 views
0

まず、この難題を取り上げていただきありがとうございます。Symfonyの絶対パス/ルートをチェックする方法は?

目標:

私のURL構造が似ているFacebookの/さえずり:site.com/Username

、ユーザがユーザ名を設定できるようにするには、私はルートのパスが一致するかどうかを確認する必要がありますユーザー名。

可能性&問題:getRouteCollection()

問題を使用して

1):このメソッドはすべきではない

誰かが興味を持っている場合は、私が思いついた可能な解決策(https://github.com/symfony/symfony-docs/issues/6710を参照)

2.)ブラックリストをユーザーのRegExpとして使用すると、ルートキャッシュを再構築してパフォーマンスが低下するために使用されますエンティティ

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

問題は...「約」、「設定」、「ログイン」、「登録」のように、すべてのサイトをブラックリストに(ユーザ名用):時にはURLがあるので、これはほぼに保証されてを爆発site.com/username結果ならば404

問題でチェックするCURLを使用して)この正規表現に

3を追加するのを忘れ:これは私と専門外のため、「ハック」のようです。

質問:チェックの

いただきましたプロ、安全な方法ユーザ名を設定することができ、「自由」であることが保証されるように、ルートがすでに存在していない場合(絶対パスを経由してsite.com/Usernameのように他のルートはありません) $ APP-> hasURLのような例何か( '/ユーザ名')

+1

私はあなたが問題を考える上ではないと思っています。ルートは定義されている順番に一致しています。つまり、/ register、/ loginなどの前に/ {username}を定義していれば、すべてうまくいくでしょう。 – Cerad

答えて

1

ADDによって

:次に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にエンコードされた文字が含まれないようにするため、有効なユーザー名を制限する方がよいでしょう。

関連する問題