Laravel yajra datatable: невозможно получить параметр поиска из вызова ajax в контроллере

Я пытаюсь создать dataTable с настраиваемой фильтрацией с помощью yajra datatable из здесь:

Таблица HTML в поле зрения:

  <form id = "search-form" class = "form-inline" method = "POST" role = "form" action = "#">


      <select id = "batch" name = "batch">
        <option value = "">Select</option>
        <option value = "22">Skill Level CBE Dec 2018</option>
        <option value = "2">Batch 2</option>

      </select>

      <button class = "btn  btn-primary" type = "submit">Search</button>

  </form>

     <table class = "table table-striped table-bordered datatable" cellspacing = "0" width = "100%">

                                    <thead>

                                        <tr>



                                            <th>{{ getPhrase('S/N')}}</th>

                                            <th>{{ getPhrase('Batch')}}</th>
                                            <th>{{ getPhrase('Course')}}</th>
                                            <th>{{ getPhrase('Subject')}}</th>

                                            <th>{{ getPhrase('title')}}</th>

                                            <th>{{ getPhrase('otq_marks')}}</th>
                                            <th>{{ getPhrase('cr_marks')}}</th>

                                            <th>{{ getPhrase('total')}}</th>
                                            <th>{{ getPhrase('average')}}</th>




                                        </tr>

                                    </thead>



         </table>


        @section('footer_scripts')



         @include('common.datatables', array('route'=>URL_STUDENT_EXAM_GETATTEMPTS.$user->slug, 'route_as_url' => 'TRUE'))


        @stop

Что касается common.datatables, то datatables.blade.php имеет:

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name = "csrf-token"]').attr('content')
        }
    });

     tableObj = $('.datatable').DataTable({
            processing: true,
            serverSide: true,
                retrieve :true,
            // cache: true,
            type: 'GET',

            ajax: {
             url: '{{ $routeValue }}',
             data: function (d) {
                 d.batch = $('#batch').val();

             }
         }



     });


    $('#search-form').on('submit', function(e) {
        tableObj.draw();
        e.preventDefault();
    });

Значение url-адреса ajax $ routeValue относится к константе URL_STUDENT_EXAM_GETATTEMPTS (поясняется позже), используемой в представлении каким-либо образом.

Когда я выбираю значение из раскрывающегося списка "batch" и нажимаю кнопку submit, для маршрута выполняется вызов ajax. В инструменте проверки браузера я вижу, что в URL-адрес ajax добавлено множество параметров запроса, а также наш параметр batch. Теперь мне нужно получить этот параметр batch внутри контроллера.

Теперь о коде на стороне сервера:

Константа URL_STUDENT_EXAM_GETATTEMPTS, используемая в лезвии, имеет значение PREFIX.'exams/student/get-exam-attempts/'.

А в route.php маршрут определяется как:

Route::get('exams/student/get-exam-attempts/{user_slug}/{exam_slug?}', 'StudentQuizController@getExamAttemptsData');

В контроллере у меня есть:

public function getExamAttemptsData(Request $request,$slug, $exam_slug = '')
    {

    //body goes here 

    }

Я использовал все следующие методы, чтобы получить параметр batch в контроллере, но напрасно:

$request->get('batch')
$request->query('batch')
Input::get('batch')

Как я могу получить значение batch внутри контроллера?

Обновлено: Кстати, я использую use Illuminate\Http\Request; для переменной Request $request в параметре функции контроллера.

РЕДАКТИРОВАТЬ2: Инструмент проверки браузера показывает URL-адрес запроса ajax как:

http: // localhost / lcbs / excs / student / get-exam-plays / myuser123? draw = 2 & columns% 5B0% 5D% 5Bdata% 5D = 0 ...... search% 5Bregex% 5D = false & партия = 22 & _ = 1541684388689.

Итак, вы видите, что batch присутствует в параметрах запроса. Но внутри контроллера код $request->getQueryString() показывает только %2Fexams%2Fstudent%2Fget-exam-attempts%2Fmyuser123

И \URL::current() показывает http: // localhost / lcbs / excs / student / get-exam-plays / myuser123

Это означает, что $request пропускает всю строку запроса.

РЕДАКТИРОВАТЬ3: @ Адриан Эрнандес-Лопес, я вставляю ПОЛНОЕ содержимое Kernel.php сюда:

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array
     */
    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,

    ];

    /**
     * The application's route middleware groups.
     *
     * @var array
     */
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
        ],

        'api' => [
            'throttle:60,1',
        ],
    ];

    /**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     * @var array
     */
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'can' => \Illuminate\Foundation\Http\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,

        'role' => \Zizaco\Entrust\Middleware\EntrustRole::class,
        'permission' => \Zizaco\Entrust\Middleware\EntrustPermission::class,
        'ability' => \Zizaco\Entrust\Middleware\EntrustAbility::class,
       // 'adminOrGuest' => \App\Http\Middleware\AdminOrGuestMiddleware::class,

    ];
}

Что происходит, когда вы проверяете суперглобал $ _GET ['batch'] в вашем контроллере? Я знаю, что это не лучшее решение, но вы должны проверить это только для отладки.

ISTI 08.11.2018 22:36

@ISTI, пустой вывод

Istiaque Ahmed 09.11.2018 16:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
2
1 358
1

Ответы 1

Похоже на? в Route не используется для определения необязательного параметра, а вместо этого используется строка:

Route::get('exams/student/get-exam-attempts/{user_slug}/{exam_slug?}', 'StudentQuizController@getExamAttemptsData');

Не могли бы вы изменить его и посмотреть, что у вас получится?

Route::get('exams/student/get-exam-attempts/{user_slug}/{exam_slug}', 'StudentQuizController@getExamAttemptsData');

Кроме того, в отправленной вами строке запроса есть пробел после myyser123, это также может объяснить проблему.

http:// localhost/lcbs/exams/student/get-exam-attempts/myuser123 ?draw=2&columns%5B0%5D%5Bdata%5D=0......search%5Bregex%5D=false&batch=22&_=1541684388689.

Поэтому я предлагаю проверить, как значение определяется в коде javascript.

url: '{{ $routeValue }}',
exam_slug - необязательный параметр, поэтому нельзя сделать его обязательным. Что касается пространства после myuser123, я намеренно добавил его при написании в SO, чтобы ссылка просто превратилась в текст, не являясь какой-либо реальной ссылкой, потому что ссылка указывает на localhost, а не на какой-либо онлайн-сайт.
Istiaque Ahmed 09.11.2018 16:37

Можете ли вы проверить, нет ли перенаправления, которое может перенаправлять? Появляются ли другие параметры получения, перетаскивания, столбцов и т. д. В объекте запроса?

Adrian Hernandez-Lopez 10.11.2018 18:54

если бы там было перенаправление, то таблица яджры не отображалась бы. Остальные параметры также недоступны. Но я обнаружил, что с \Request::getRequestUri(); я могу получить весь URL-адрес, кроме части «localhost». С этого момента я могу explode строку URL-адреса, используя & в качестве разделителя, и получить все параметры в массиве, и из этого массива я могу посмотреть, есть ли определенный параметр (например, `` пакет ''), и могу ли его использовать.

Istiaque Ahmed 10.11.2018 19:41

$request->input('batch') также возвращает пустой? А также, какой вывод вы получаете от $request->all();?

Adrian Hernandez-Lopez 12.11.2018 16:36
$request->input('batch') пуст, а var_dump($request->all()); дает array(1) { ["/exams/student/get-exam-attempts/myuser123"]=> string(0) "" }
Istiaque Ahmed 15.11.2018 07:26

Это интересно. Таким образом, URI запроса полностью преобразуется в параметр запроса. Я бы предложил проверить промежуточное программное обеспечение, а также отладить значения $ _GET перед контроллером, например, чтобы проверить значения в первом промежуточном программном обеспечении, вызванном в запросе.

Adrian Hernandez-Lopez 15.11.2018 09:50

Как мне проверить значения в первом промежуточном программном обеспечении, вызванном в запросе?

Istiaque Ahmed 15.11.2018 10:33

В Kernel.php у вас может быть массив $middleware с этими промежуточными программами, вызываемыми в каждом запросе; и вы можете проверить свои файлы маршрутов, чтобы найти другие промежуточные программы, называемые. Проверьте laravel.com/docs/5.7/middleware для получения дополнительной информации

Adrian Hernandez-Lopez 16.11.2018 10:19

Я добавил «EDIT3», чтобы показать все содержимое Kernel.php. Есть ли там промежуточное ПО, которое перехватывает HTTP-запрос на изменение входящих параметров?

Istiaque Ahmed 04.12.2018 17:39

Другие вопросы по теме