你好我有以下几行:
{{ 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]不存在。
答案 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 }}&{{ $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