Laravel AJAX Данные от Blade возвращают ноль, но код равен 200 - PullRequest
0 голосов
/ 27 мая 2020

Я также отправляю отчет об ошибке на 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.

Извините за длинный пост. Заранее спасибо за любую помощь, ребята.

...