2011-11-25 41 views
6

Tôi có một tình huống trong một bộ điều khiển của mình chỉ nên truy cập qua AJAX, tôi có mã sau đây.Nhận môi trường bên trong bộ điều khiển

if (!$request->isXmlHttpRequest()) { 
    $response = new Response(); 
    $response->setContent('AJAX requests only!'); 
    return $response; 
} 

Khi tôi thử nghiệm điều này mang lại cho tôi sự cố vì yêu cầu chưa thực sự được thực hiện qua AJAX. Điều này sau đó phá vỡ các bài kiểm tra của tôi mỗi lần. Làm thế nào tôi nên đi về làm việc xung quanh này?

Ý tưởng của tôi:

  1. Tôi đã cố gắng để thiết lập một tiêu đề máy chủ nhưng đã hoàn toàn không có thành công.
  2. Kiểm tra xem tôi có đang ở trong môi trường thử nghiệm trong bộ điều khiển và không thực hiện kiểm tra nếu có. Tôi biết điều này là bẩn, nhưng nó sẽ làm việc. : -/Vấn đề là tôi không thể tìm ra cách khám phá môi trường nào tôi đang ở.

Bất kỳ ai khác có ý tưởng hay mẹo nào khác mà tôi thiếu để làm một trong những điều trên làm việc?

+1

làm thế nào bạn đặt tiêu đề trong các thử nghiệm của bạn ? – meze

+0

Xem nhận xét của tôi về câu trả lời được chấp nhận. – Icode4food

Trả lời

5

Nhìn vào mã cho isXmlHttpRequest trong lớp Request và phương pháp getHeaders trong lớp ServerBag, các đoạn mã dưới đây sẽ làm các trick:

$client->request(
    'GET', 
    '/path/to/test', 
    array(), 
    array(), 
    array(
     'HTTP_X-Requested-With' => 'XMLHttpRequest', 
    ) 
); 

tôi không kiểm tra nó cá nhân nhưng tôi nghĩ rằng nó nên tác phẩm. Dòng mã bên dưới trong Request được sử dụng để kiểm tra xem yêu cầu http có phải là XmlHttpRequest hay không.

return 'XMLHttpRequest' == $this->headers->get('X-Requested-With'); 

Trong mã, $this->headers được thiết lập sử dụng:

$this->headers = new HeaderBag($this->server->getHeaders()); 

Phương pháp getHeaders tạo ra một loạt các tiêu đề. Mỗi biến máy chủ bắt đầu bằng HTTP_, cộng với một số biến máy chủ đặc biệt như CONTENT_TYPE, được đặt trong mảng này.

Hy vọng điều này sẽ hữu ích.

Kính trọng,
Matt

+0

Bạn nhấn vào vấn đề trên đầu. Tôi đã đặt tiêu đề là 'X-Requested-With' thay vì bằng tiền tố' HTTP_'. Tôi nghĩ tôi đã thử nhưng ... tôi đoán là không. Cảm ơn. – Icode4food

8

Tất nhiên trong trường hợp Icode4food, nó là tốt hơn để sử dụng giải pháp của Matt, nhưng ở đây là làm thế nào để tìm ra môi trường hiện tại:

$this->container->getParameter(‘kernel.environment’) 
+0

không nên là $ container-> getParameter ('kernel.environment') ;? –

+0

@ TroodoN-Mike - vâng, nó đã được thay đổi. đã sửa. – dvb

Các vấn đề liên quan