Привет, у меня есть следующая строка:
{{ 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']);
однако url не разбирает 2 аргумента правильно, поскольку он появляется как / add1% 262 вместо / add? 1 & 2
Я не могу понять, почему, он работал раньше. Также он приходит с методом [show], не существует, когда он проходит.
Здесь есть две проблемы, которые не соответствуют вашим ожиданиям относительно того, что должно произойти:
1. Первым и наиболее link_to_action
является то, что вспомогательная функция link_to_action
использует метод to
в классе Illuminate\Routing\URLGenerator
для генерации URL-адреса, который, в свою очередь, использует метод rawurlencode
который будет кодировать зарезервированные символы в соответствии с RFC 3986 , Поскольку символ &
является зарезервированным символом субграничника, он автоматически получает кодировку до %26
, что приведет к тому, что ваш URL-адрес будет выглядеть так /add1%262
.
2. Вторая проблема заключается в том, что вы определяете маршрут маршрута, как этот friend/add{id}&{fid}
, но вы ожидаете, что он будет иметь ?
там. Даже если вы должны добавить это определение маршрута, например, так: friend/add?{id}&{fid}
, он все равно не будет работать, потому что ?
является символом разделителя и также будет закодирован, так что вы получите /add%3F1%262
.
Центральная проблема здесь заключается в том, что вы не должны определять параметры строки запроса в своем определении маршрута Laravel. Таким образом, вы либо перемещаете параметры из определения маршрута в строку запроса, либо строят свою HTML-ссылку и URL-адрес вручную:
// 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]) }}
При том, что даже с вашей текущей настройкой, которая генерирует путь /add1%262
, Laravel все равно будет знать, как декодировать параметры, поэтому в вашем методе действия контроллера вы все равно получите 1
и 2
в качестве идентификаторов пользователя:
public function add($id, $fid) { // $id = 1 // $fid = 2 }