2009-09-30 28 views
7

Tôi sẽ bắt đầu một dự án sử dụng triển khai Zend Framework MVC.MVC: làm thế nào để ajax?

Làm cách nào để làm việc với ajax? Tôi có nghĩa là, tôi nên đặt tất cả các mã ajax vào bộ điều khiển? Hoặc vào xem?

Ví dụ: tôi muốn nhận bài đăng từ tác giả 'ivan' để hiển thị trên trang.

Thông thường, tôi tạo liên kết đến '/ posts/author/ivan' hoặc smth như nó, tạo một Hành động mới như 'byAuthorAction()' trong bộ điều khiển Bài viết (hoặc có thể là Bộ điều khiển người dùng, ở bất kỳ đâu), xem nó (và tất cả các mã những gì được bài viết từ mô hình đi có) và tạo ra một lộ trình mới cho nó.

Cách thêm chức năng để nhận bài đăng của bất kỳ người dùng nào ở định dạng json, xml cho ajax và có thể API, giữ nguyên tắc DRY và thiết kế cấu trúc mã thông minh nhất có thể?

-

Cảm ơn bạn đã trả lời! Tôi sẽ rất vui khi thấy ý kiến ​​về thiết kế MVC trong các tình huống như tôi. Tôi có một số kinh nghiệm trong các nguyên tắc cơ bản của MVC nhưng không phải trong các trường hợp phức tạp hơn. Có lẽ một số liên kết hữu ích?

Trả lời

13

Bạn thực sự nên đọc chương tay về Helper Action ContextSwitch. Nhưng đây là một phác thảo ngắn gọn:

  • kịch bản tầm nhìn của bạn (action-name.phtml) được sử dụng cho đầu ra HTML thông thường
  • bạn có thể khởi tạo một chuyển ngữ cảnh đối với một số hành động trong bộ điều khiển để Thầy có thể xuất ví dụ Ngữ cảnh XML - xml được hỗ trợ theo mặc định và bạn sẽ đặt kịch bản xem của bạn cho ngữ cảnh xml trong (action-name.xml.phtml); bối cảnh xml cũng vô hiệu hóa việc hiển thị bố cục
  • json cũng được hỗ trợ bởi công tắc ngữ cảnh tích hợp và tùy chọn mặc định là tắt cả bố cục và chế độ xem và xuất tất cả các biến được gán cho chế độ xem từ hành động điều khiển ở định dạng JSON , tùy chọn này có thể được chuyển đổi bằng cách sử dụng phương thức setAutoJsonSerialization (false) của switch ngữ cảnh; nhưng nếu bạn chuyển đổi nó, bạn phải tạo một tập lệnh xem action-name.json.phtml và xuất các biến theo định dạng JSON bằng tay

Để chuyển đổi giữa hai ngữ cảnh này, bạn phải thêm thông số định dạng vào URL của mình, ví dụ:/posts/author/ivan/format/json hoặc/posts/author/ivan/format/xml. Nếu bạn không chỉ định định dạng, ứng dụng của bạn sẽ xuất ra html thuần túy.

Phiên bản đặc biệt của chuyển đổi Ngữ cảnh là AjaxContext và bạn cũng phải định cấu hình phiên bản này bằng tay. Nó không sử dụng tham số 'format' để xác định định dạng nào nên sử dụng cho đầu ra nhưng nó kiểm tra tiêu đề được gửi trong yêu cầu của bạn và tìm tiêu đề 'X-Requested-With: XmlHttpRequest' và nếu nó hiện diện thì AjaxContext được kiểm tra. Sử dụng trình trợ giúp hành động AjaxContext, bạn có thể chỉ định ngữ cảnh nào sẽ được sử dụng cho các hành động cụ thể nếu yêu cầu được kích hoạt bằng AJAX.

8

Bạn có thể sử dụng cùng một hành động để trả về XML, JSON hoặc bất kỳ điều gì, bằng cách phát hiện các yêu cầu ajax và do đó có thể phân biệt các yêu cầu ajax từ các yêu cầu bình thường. Ví dụ:

public function fooAction() 
{ 
    if($this->getRequest->isXmlHttpRequest()) { 
     echo json_encode($someData); 
    } else { 
     echo 'This is the normal output'; 
    } 
} 
+0

cách chọn giữa xml và json? tôi có nên định dạng url như/posts/author/ivan cho html, /posts/author/ivan.xml, /posts/author/ivan.json, /posts/author/ivan.rss vv cho các định dạng không? –

+0

Không, URL sẽ giống nhau. Bạn có thể sử dụng json_encode() để xuất nội dung ở định dạng JSON. http://ar2.php.net/json_encode –

+0

json nhẹ hơn và dễ dàng hơn để làm việc với IMO. Bạn có thể tạo một khung nhìn JSON hoặc bạn có thể echo json_encode() mảng dữ liệu của bạn mà không sử dụng một khung nhìn, có thể bạn sẽ phải tắt chế độ xem tự động. – karim79

2

Chế độ xem của bạn có thể khác với HTML và đường ống có thể phản ứng với yêu cầu là bài đăng ajax hoặc bộ điều khiển của bạn có thể phản ứng. Dù bằng cách nào, nó cũng đơn giản như trả lại một Chế độ xem khác.

1

Hãy xem AjaxContext Action-Helper (hoặc ContextSwitch một, nó mở rộng), và nó sẽ cho phép bạn sử dụng chính xác cùng một mã điều khiển, chuyển sang một khung nhìn riêng biệt (foo.json. phtml, hoặc foo.ajax.phtml, vv - được chọn tự động từ tham số định dạng?) hoặc sử dụng Trình trợ giúp hành động JSON sẽ trả về một đối tượng bao gồm tất cả các biến mà bạn gán cho chế độ xem - vì vậy bạn không cần phải được lặp lại từ bộ điều khiển của bạn (mà sẽ mess up đơn vị kiểm tra, bạn nên có chúng).

+0

oh, chắc chắn. làm thế nào tôi có thể không nhìn thấy nó? –

0

cú pháp của tôi có thể là cũ nhưng đây là một phác thảo của hành động REST của tôi từ điều khiển Index của tôi:

/** 
* REST Action for this application. 
* 
* @return void 
*/ 
public function restAction() 
{ 
    $this->_helper->viewRenderer->setNoRender(true); 

    $parameters = (func_num_args() > 0) ? array($key => func_get_arg(0)) : $this->getRequest()->getParams(); 

    $key = 'restCommand'; 
    if(!array_key_exists($key, $parameters)) throw new Exception('Request for “' . $key . '” not found.'); 
    $restCommand = $parameters[$key]; 

    $xmlString = IndexModel::getEmptyXmlSet($restCommand); 
    $xslFile = IndexModel::getModelFilePath('index'); 

    //Handle OPML-driven REST commands: 
    if(stripos($restCommand, 'opml-') === 0) 
    { 
     $opmlCall = explode('-', $restCommand); 
     if(count($opmlCall) != 3) 
     { 
      $xmlString = Songhay_SimpleXml::getXmlMessage('OPML Call Not Recognized', array('The number of parameters are incorrect.')); 
     } 
     else 
     { 
      $opmlSet = $opmlCall[1]; 
      $opmlId = $opmlCall[2]; 
      $xmlString = IndexModel::getRssFragmentWithOpml($opmlSet, $opmlId); 
     } 
    } 

    //Handle general REST commands: 
    switch($restCommand) 
    { 
     case 'deeplink': 
      $key = 'id'; 
      if(!array_key_exists($key, $parameters)) throw new Exception('Request for “' . $key . '” not found.'); 
      $url = $parameters[$key]; 
      $xmlString = IndexModel::getRssFragment($url); 
      $xmlString = Songhay_SimpleXml::loadXslString($restCommand, $xmlString, $xslFile); 
      break; 
     case 'index': 
      $opmlFile = IndexModel::getModelFilePath('index', '.xml'); 
      $xmlString = Songhay_SimpleXml::loadXmlAndStripNamespaces($opmlFile); 
      $xmlString = Songhay_SimpleXml::loadXslString($restCommand, $xmlString, $xslFile); 
      break; 
     default: 
      $xmlString = Songhay_SimpleXml::loadXslString($restCommand, $xmlString, $xslFile); 
    } 

    $response = $this->getResponse(); 
    $response->setHeader('Content-Type', 'text/xml'); 
    $response->setBody($xmlString); 

    return; 
} 
0

Khi tôi sử dụng ajax với bộ mã vạch i, xuất ra thẳng bộ điều khiển.

Tôi cũng sử dụng bộ điều khiển riêng biệt cho các yêu cầu ajax đơn giản như gắn cờ, yêu thích, v.v. Đối với yêu cầu ajax như đăng nhập, liên hệ, v.v ... tôi sẽ thêm logic vào đường dẫn thông thường (ví dụ: domain.com/contact) yêu cầu ajax. Sau đó tôi xuất json và giết thực thi script.

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