Предположим, что маршрут такой:
Route::get('messages/{messages}', ['as' => 'messages.show', 'uses' => 'MessagesController@show']);
Итак, когда мы создадим URL, используя URL-помощник Laravel,
{{ 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>
Ларавелла UrlGenerator
класс не поддерживает указание #fragment
часть URL. Код, отвечающий за создание 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') }}
Конечно, вы можете назвать функцию как хотите, если вы чувствуете, что имя, которое я дал, слишком длинное.
Других решений пока нет …