2

假设路线是这样的:

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

因此,当我们使用 Laravel 的 URL 助手创建 URL 时,

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

将显示example.com/messages/12.

这是对的。让我们在 URL 中添加一些哈希。

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

这将显示example.com/messages/12#reply_23

这看起来不错。现在让我们添加一些查询字符串而不是哈希。

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

这将显示example.com/messages/12?ref=email。这看起来很酷。

现在添加查询字符串和哈希。

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

现在这将显示example.com/messages/12?ref=email&#reply_23&由于URL 中的 ,这看起来有点难看。但是它并没有造成很多问题,我想获得一个干净的 URL,例如example.com/messages/12?ref=email#reply_23. 有没有办法摆脱&URL 中不必要的内容?

编辑: 有一个解决方法,但我正在寻找一个可靠的答案。

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

1 回答 1

3

LaravelUrlGenerator类不支持指定#fragmentURL 的一部分。负责构建 URL 的代码如下,您可以看到它只是附加了查询字符串参数,没有其他内容:

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

对您的代码的快速测试显示您发布的第二个示例:

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

实际生成:

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

所以它被视为#reply_23一个参数而不是一个片段。

这个缺点的替代方法是编写一个自定义帮助函数,允许将片段作为第三个参数传递。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 回答