Laravel 4.2链接到动作链接&如%27

时间:2015-05-31 12:44:50

标签: php laravel web

你好我有以下几行:

{{ link_to_action('FriendController@add', 'Friend ' .explode(" ", $user->name)[0],[Auth::user()->id,$user->id]) }}

和定义为

的路线
Route::post('friend/add{id}&{fid}', ['as' => 'friend.add', 'uses' => 'FriendController@add']);

然而,网址没有正确解析2个参数,因为它出现为/ add1%262而不是/ add?1& 2

我无法弄清楚为什么,它之前有效。另外,当它确实经过时,方法[show]不存在。

1 个答案:

答案 0 :(得分:2)

这里有两个问题,无法满足您对应该发生的事情的期望:

1。第一个也是最重要的一个是,link_to_action帮助函数使用Illuminate\Routing\URLGenerator类中的to方法生成URL,而后者又使用rawurlencode方法根据RFC 3986对保留字符进行编码。由于&字符是保留的子分隔符,因此它会自动编码为%26,这会导致您的网址路径看起来像/add1%262

2。第二个问题是您定义的路线路径如此friend/add{id}&{fid},但您希望其中有?。即使你要像friend/add?{id}&{fid}那样添加路由定义,它仍然无效,因为?是一个分隔符,并且也会被编码,所以你最终会得到{{1 }}

这里的核心问题是您不应该在Laravel路由定义中定义查询字符串参数。因此,您可以将参数从路径定义移动到查询字符串,并手动构建HTML链接和URL:

/add%3F1%262

或者更改路由定义,使其不包含任何可能被编码的保留字符:

// routes.php
Route::post('friend/add', ['as' => 'friend.add', 'uses' => 'FriendController@add']);

// Your Blade template
<a href="{{ action('FriendController@add') }}?{{ Auth::user()->id }}&amp;{{ $user->id }}">
    Friend {{ explode(" ", $user->name)[0] }}
</a>

话虽如此,即使您当前的设置生成路径// routes.php Route::post('friend/add/{id}/{fid}', ['as' => 'friend.add', 'uses' => 'FriendController@add']); // Your Blade template {{ link_to_action('FriendController@add', 'Friend ' .explode(" ", $user->name)[0],[Auth::user()->id,$user->id]) }} ,Laravel仍然会知道解码参数,因此在您的控制器操作方法中,您仍然会获得/add1%262和{{ 1}}作为用户ID:

1