2

Suppose the route is like this:

Route::get('messages/{messages}', ['as' => 'messages.show', 'uses' => 'MessagesController@show']);

So, when we will create an URL using URL helper of Laravel,

{{ route('messages.show', 12) }}

will display example.com/messages/12.

This is correct. Let's have some hash in the URL.

{{ route('messages.show', [12, '#reply_23']) }}

This will display example.com/messages/12#reply_23.

This looks good. Now let's add some query strings instead of the hash.

{{ route('messages.show', [12, 'ref=email']) }}

This will display example.com/messages/12?ref=email. This looks cool.

Now add both query string and hash.

{{ route('messages.show', [12, 'ref=email', '#reply_23']) }}

Now this will display example.com/messages/12?ref=email&#reply_23. This looks little ugly because of the & in the URL. However it's not creating a lot of problem, I would like to get a clean URL like example.com/messages/12?ref=email#reply_23. Is there a way to get rid of the unnecessary & in the URL?

Edit: There is a workaround, but I am looking for a solid answer.

<a href="{{ route('messages.show', [12, 'ref=email']) }}#reply_23">Link to view on website</a>
4

1 に答える 1

3

Laravelクラスは、URLUrlGeneratorの一部の指定をサポートしていません。#fragmentURL の作成を担当するコードは次のとおりです。クエリ文字列パラメーターを追加するだけで、他には何も追加していないことがわかります。

$uri = strtr(rawurlencode($this->trimUrl(
            $root = $this->replaceRoot($route, $domain, $parameters),
            $this->replaceRouteParameters($route->uri(), $parameters)
        )), $this->dontEncode).$this->getRouteQueryString($parameters);

コードを簡単にテストすると、投稿した 2 番目の例が次のようになります。

{{ route('messages.show', [12, '#reply_23']) }}

実際に生成するもの:

/messages/12?#reply_23 // notice the "?" before "#reply_23"

#reply_23そのため、フラグメントとしてではなくパラメーターとして扱います。

この欠点に代わる方法は、フラグメントを 3 番目のパラメーターとして渡すことができるカスタム ヘルパー関数を作成することです。app/helpers.phpカスタム関数を使用してファイルを作成できます。

function route_with_fragment($name, $parameters = array(), $fragment = '', $absolute = true, $route = null)
{
    return route($name, $parameters, $absolute, $route) . $fragment;
}

app/start/global.php次に、ファイルの最後に次の行を追加します。

require app_path().'/helpers.php';

その後、次のように使用できます。

{{ route_with_fragment('messages.show', [12, 'ref=email'], '#reply_23') }}

もちろん、私が付けた名前が長すぎると感じた場合は、関数に好きな名前を付けることができます。

于 2015-01-22T14:40:51.930 に答える