Я также отправляю отчет об ошибке на Laravel по этому поводу, но я решил сначала проверить здесь, есть ли у кого-нибудь идеи, хотя я почти уверен, что это ошибка.
PHP
версия 7.3.
Вот что я пытаюсь сделать: у меня есть эта функция в моем контроллере под названием editRoute
. В пользовательском интерфейсе это список клиентов, полученных от MySQL
, упорядоченный в порядке их числовых обозначений, происходящих от db - route_order
. Вот первая часть моего шаблона, которую я хочу показать вам:
<form name="order" class="form-group" method="POST" action="{{ url('routes/edit-route/{id}') }}">
<div class="row mt-5">
<div class="col-md-10 offset-md-1">
<h3 class="text-center mb-4">Drag and Drop Customers to Your Choosing</h3>
<ul id="tablecontents">
{{-- <input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">--}}
@foreach($customers as $customer)
<li class="row1 drag-a-customer"
data-id="{{ $customer->id }}" >
<a style="cursor: move;" class="btn btn-outline-primary btn-lg btn-block">
<i class="fa fa-reorder fa-lg" ></i>
{{ $customer->name . ' - ' . $customer->address }}
</a>
@endforeach
</ul>
<hr>
<h5>Drag and Drop the table rows and <button id="button" onclick="sendOrderToServer()" type="submit" class="btn btn-primary btn-lg" >Save</button> the page.</h5>
</div>
</div>
</form>
Пользователь перетаскивает клиентов в том порядке, в котором они хотят их (это реальный маршрут, по которому человек посещает клиентов, поэтому им нужно время от времени меняют свои маршруты). Это работает правильно в jQuery
ниже:
$(function() {
$("#tablecontents").sortable({
items: "li",
cursor: 'move',
});
});
После того, как пользователь переупорядочивает клиентов, они нажимают кнопку «Сохранить», и выполняется следующий код:
function sendOrderToServer() {
const order = [];
const token = $('meta[name="_token"]').attr('content');
$('li.row1').each(function (index, element) {
order.push({
id: $(this).attr('data-id'),
position: index + 1
});
});
console.log('first log', order);
const url = "{{ url('routes/edit-route/{id}') }}"
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': token
}
});
$.ajax({
type: "post",
success: function(order) {
if (status === 'success'){
console.log('AJAX worked', order);
}
},
data: {order: order},
cache: false,
dataType: 'text',
url: url,
statusCode: {
200: function(data) {
console.log('data', data);
}
}
});
}
console.log
выше выводит правильный JSON с правильно отформатированным data
. А в пользовательском интерфейсе, исходящем из бэкэнда, это:
{
"success": true,
"order": null
}
Я использую dataType: 'text'
, поскольку это дало правильные данные, когда console.log
срабатывает выше. Использование dataType
вместо 'json'
, похоже, не имеет никакого значения. Это по-прежнему дает тот же результат.
Функция success
в методе .ajax
никогда не выполняется. Раньше у меня была функция .fail
, и она всегда работала.
console.log
под statusCode
выгружается в консоль в правильном (я проверил) JSON формате точных данных, которые я хочу. По какой-то причине он не доходит до бэкэнда. Вот мой код контроллера:
public function update(Request $request, $id) {
$test = response()->json(array( 'success' => true, 'order' => $request->post('order')), 200, array('allow origin' => 'Access-Control-Allow-Origin'));
return $test;
К вашему сведению, я пробовал описанное выше с обоими $request->post('order')
и $request->get('order')
. Оба они дают одинаковый результат.
Я работаю в локальной среде разработки, используя сервер laravel (который, как мне кажется, использует встроенный сервер PHP). У нас также есть песочница на AWS, поэтому я загрузил туда код, чтобы посмотреть, воспроизводится ли тот же результат, и это произошло. Затем мой коллега взял проблемный код и протестировал его вне проекта Laravel, и он работал отлично. На данный момент я должен сказать, что это проблема Laravel.
Я просмотрел десятки сообщений SO, чтобы найти решение этой проблемы, er go Я перепробовал множество потенциальных исправлений, включая размещение csrf_token
в разных местах (голова в шаблоне лезвия I работал, голова в шаблоне родительского лезвия и скрытый тег <input>
прямо под тегом <li>
, много разных библиотек jQuery
, чтобы увидеть, был ли виноват виновник, я также попробовал .post
вариант, который не использует jQuery
, и результат был тот же. Я проверил проблемы с перекрестным происхождением, которые не имели бы смысла, потому что в этом приложении сделано множество сообщений и запросов на размещение, и все они полностью функционируют. также в какой-то момент добавил прослушиватель событий к JavaScript
, который не дал результатов.
Вот что происходит, когда я перехожу с Xdebug при нажатии кнопки «Сохранить» в пользовательском интерфейсе: сначала под _POST
а также _REQUEST
- это все данные, которые я ищу. Затем, когда я перехожу, они исчезают, и все, что у меня остается под _POST
a nd _REQUEST
- это _token
, а не другие данные, поэтому order
возвращает null
. Когда отладка будет завершена, останутся только данные _token
. После запуска кода в нашей песочнице AWS мы вытащили журналы ошибок и обнаружили, что действительно происходит то, что я только что объяснил - где-то в строке данные перезаписываются или не доходят до места назначения.
Если у кого-то есть идеи, дайте мне знать. Я просто хотел сначала проверить здесь, прежде чем отправлять отчет об ошибке на Laravel.
Извините за длинный пост. Заранее спасибо за любую помощь, ребята.