2013-12-09 32 views
26

Tôi đang xây dựng ứng dụng với angularjs và laravel 4. Mọi thứ đều ổn nhưng bây giờ tôi chỉ cần cho phép yêu cầu XHR.Laravel angularjs Yêu cầu :: ajax() luôn sai

Đây là những gì tôi có ở đầu bộ điều khiển của mình. Nhưng tuyên bố này luôn luôn là sai.

if (!\Request::ajax()) 
    { 
     return Response::json(array('halt'=>Request::ajax())); 
    }; 

Ở góc cạnh Tôi đang sử dụng dịch vụ http $ chuẩn.

angular.module('APP') 
.factory("API", ($http,$q,appClient,apiURL) -> 
class FB 
    constructor:-> 
    this.deferredData = $q.defer(); 
    info: (reload)-> 
    $http(
     method: "get" 
     url: apiURL+'game/'+appClient+"/info" 
    ).success((res)-> 
     dostuff() 
    ) 
+1

[Kiểm tra câu trả lời này] (http://stackoverflow.com/questions/20166320/laravel-4- ajax-check-to-include-xmlhttprequest-từ-magnific-popup/20167599 # 20167599). –

+1

Thông thường có một tiêu đề được đặt bởi hầu hết các trình duyệt khi thực hiện cuộc gọi AJAX: 'X-Requested-With: XMLHTTPRequest'. Bạn có thấy tiêu đề đó từ trình kiểm tra trình duyệt không? – SuperSaiyan

+5

Cảm ơn rất nhiều Tôi phải đặt: '$ httpProvider.defaults.headers.common [" X-Requested-With "] =" XMLHttpRequest "' – zajca

Trả lời

33

Khi thực hiện cuộc gọi AJAX, tiêu đề X-Requested-With thường được đặt thành XMLHttpRequest. Phương thức Request::ajax() của Laravel được xây dựng dựa trên phương thức Symfony2, chỉ cần kiểm tra sự hiện diện của tiêu đề này.

Vào tháng 10 năm 2012, Angular.js removed tiêu đề này vì chúng cảm thấy rằng nó hiếm khi được sử dụng.

Như @Thrustmaster và bản thân đề cập trong các ý kiến, bạn cần phải thiết lập:

$httpProvider.defaults.headers.common["X-Requested-With"] = "XMLHttpRequest" 
+0

Vâng, tôi biết rằng câu hỏi này rất cũ. Câu trả lời này chỉ là để có được nó ra khỏi danh sách "câu hỏi chưa được trả lời" - đó là lý do tại sao nó là wiki cộng đồng. –

20

Nếu bạn không muốn sửa đổi ứng dụng góc front-end (hoặc không thể), và thà sửa đổi đang Laravel của bạn để phân biệt giữa các yêu cầu kiễu góc JS AJAX vs các yêu cầu khác, bạn cũng có thể sử dụng Request::wantsJson():

if(Request::wantsJson()) { 
    // Client wants JSON returned 
} else { 
    // Client does not want JSON returned 
} 

phương pháp wantsJson dựa vào tiêu đề Accepts HTTP chuẩn (chứ không phải là phi tiêu chuẩn X-Requested-With tiêu đề) với sự hiện diện của application/json. Miễn là Angular JS để nó theo mặc định và bạn không loại bỏ nó theo mục đích, phương pháp này đáng tin cậy.

+0

Cảm ơn, tôi thích giải pháp này :) –

+0

Hoàn hảo. Chỉ cần những gì tôi đang tìm kiếm. – skovmand

+0

Cần một phiếu bầu kép: +1 – Murwa

13

Đối AngularJs người mới tìm kiếm nơi để thêm $httpProvider.defaults.headers.common["X-Requested-With"] = "XMLHttpRequest"

Dưới đây là một ví dụ:

var angularApp = angular 
    .module('angularApp', [ 
    'ngResource', 
    ]) 
    .config(['$httpProvider', function($httpProvider) { 
     $httpProvider.defaults.headers.common["X-Requested-With"] = 'XMLHttpRequest'; 
    }]); 
Các vấn đề liên quan