$ request-> ajax () всегда возвращает false - PullRequest
1 голос
/ 14 октября 2019

Я сталкиваюсь со странным поведением, не имея ни малейшего понятия, почему и как его решить. Я новичок в PHP / Laravel / Ajax, так что будьте добры, пожалуйста ^^

Моя форма блэйда:

<form method="post" action="{{ route('postContact') }}" id="id_post_contact">
    @csrf
    <input class="form-control" type="text" name="in_email" placeholder="contact@email.com">
    [...]
    <button class="btn" type="submit">Submit Question</button>
</form>

<div>
    <script>
        $("#id_post_contact").submit(function(e) {
            e.preventDefault();

            var form = $(this);
            var url = form.attr('action');
            var data2Send = form.serialize();

            $.ajax({
                type:'POST',
                url:url,
                headers:{
                    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'),
                },
                data:data2Send,
                dataType:'JSON',
                cache:false,
                //contentType:'application/json',
                success: function(data) {
                    alert(data.success);
                }
            });
        });
    </script>
</div>

Мой маршрут:

Route::post('/contact', 'BasisController@postContactEmail')->name('postContact');

Мой контроллер postContactEmail метод:

public function postContactEmail(Request $req){
    dd(
        $req->ajax(),
        $req->isXmlHttpRequest(),
        $req->all()
    );

    return response()->json(['success' => 'Got Simple Ajax Request.']);
}

И по причине, которую я игнорирую, мой $ req-> ajax () всегда возвращает false .

У меня естьпопробовал много вещей, прежде чем задавать мой первый вопрос здесь, и ничего не работает, особенно то, что этот код работает до сих пор, поэтому у меня нет никакой подсказки.

Единственное отличие состоит в том, что моя версия Laravel изменилась с 5.8 на6.2.

Я не знаю, почему моя форма не отправляет данные правильно, мой запрос заголовка:

Accept  
text/html,application/xhtml+xm…plication/xml;q=0.9,*/*;q=0.8
Accept-Encoding 
gzip, deflate, br
Accept-Language 
fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3
Connection  
keep-alive
Content-Length  
149
Content-Type    
application/x-www-form-urlencoded
Cookie  
__cfduid=da74c7ad6c9ff7514e482…E_OPTINVEST_CONSENT=1; _gat=1
Host    
fake-site.tld
Referer 
https://fake-site.tld/
TE  
Trailers
Upgrade-Insecure-Requests   
1
User-Agent  
Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/69.0

И мой ответ заголовка:

cf-cache-status 
DYNAMIC
cf-ray  
5254def1febccdd7-CDG
content-encoding    
br
content-type    
text/html; charset=UTF-8
date    
Sun, 13 Oct 2019 22:50:09 GMT
expect-ct   
max-age=604800, report-uri="ht….com/cdn-cgi/beacon/expect-ct"
server  
cloudflare
vary    
Accept-Encoding
X-Firefox-Spdy  
h2

Спасибо взаранее за вашу помощь =)

Мишель

PS: моя версия jquery - 2.2.4 (даже с версией 3.4.1 поведение такое же, $ req->ajax () всегда будет возвращать false )

Ответы [ 2 ]

0 голосов
/ 14 октября 2019

Спасибо вам обоим =)

Раскрытие моих проблем здесь также помогает мне их решить ^^

Я получил решение проблемы, только "нажав" сценарий ajax в основном макетев конце, перед тэгом, как это:

<form method="post" action="{{ route('postContact') }}" id="id_post_contact">
    @csrf
    <input class="form-control" type="text" name="in_email" placeholder="contact@email.com">
    [...]
    <button class="btn" type="submit">Submit Question</button>
</form>

@push('stack_js_foot')
    <script>
        $("#id_post_contact").submit(function(e) {
            e.preventDefault();

            var form = $(this);
            var url = form.attr('action');
            var data2Send = form.serialize();

            $.ajax({
                type:'POST',
                url:url,
                headers:{
                    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'),
                },
                data:data2Send,
                dataType:'JSON',
                cache:false,
                //contentType:'application/json',
                success: function(data) {
                    alert(data.success);
                }
            });
        });
    </script>
@endpush

С моей точки зрения, я до сих пор не понимаю этого поведения ... Я всегда думал, что мы можем вызвать / объявить javascript где угодно,до тех пор, пока он заключен в теге. И это было то, что я делаю до сих пор (с успехом)

Если у кого-то есть идея, почему, я буду рад выслушать / выучить =)

Еще раз спасибо за вашу помощь

0 голосов
/ 14 октября 2019

Похоже, вы не предоставляете заголовок X-Requested-With, а Request::ajax просто проверяет наличие этого заголовка (или, по крайней мере, раньше).

Проверьте этот вопрос: Запрос Laravel angularjs :: ajax () всегда false

См. Этот вопрос для предоставления заголовка с jQuery.ajax: Междоменный AJAX не отправляет заголовок X-Requested-With

...