Laravel URL helper: Как создать идеальный URL с параметрами запроса и хэшем

Предположим, что маршрут такой:

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>

2

Решение

Ларавелла 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') }}

Конечно, вы можете назвать функцию как хотите, если вы чувствуете, что имя, которое я дал, слишком длинное.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]