Zend Framework MVC - Contollers ve Görüntüleme

3 Cevap php

Ben PHP tabanlı Zend Framework MVC kullanıyorum. Bu bir tasarım soru daha. Ben eylemlerin bir çift olan bir denetleyicisi var. Bu eylemler denetleyicisinin görünümünde AJAX erişilir. Kontrolörün eylemleri, bir model içinde fonksiyonlardan veri erişerek İş mantığını gerçekleştirmek ve inşa veya yankı HTML. Bu HTML AJAX yanıt görüntülemek için geri tükürmek. Kontrolörleri Benim anlayış onlar hiç bir HTML içermesi gerekiyordu verilmemektedir. Ancak görünümlerinde AJAX verilen, ben denetleyicisi anında HTML üretmek dışında bir seçenek yok hissediyorum. Bu iyi bir tasarım mı? Bunu nasıl artırabilir?

3 Cevap

There are two action helpers for doing exactly this. you can re-use your actions for multiple contexts with the ajaxContext or contextSwitch action helpers. The context switch is generally the more useful in my experience, and it can even automatically serialize the data you assign to the view in your action for json responses so there is no need for a view script.

Eğer böyle içerik anahtarı sıfırlanır:

class MyController extends Zend_Controller_Action
{
    public function init()
    {
        $contextSwitch = $this->_helper->getHelper('contextSwitch');
        $contextSwitch->addActionContext('index', 'json')
                      ->initContext();
    }
    public function indexAction()
    {
        $this->view->items = My_Model::fetchAll();
    }
}

Yukarıdaki içerik anahtarı için json bir bağlam katacak ve eylem isteği parametre 'format' seti ile çağrıldığında, otomatik My_Model tarafından döndürülen öğelerin bir json dizi vererek bu durumda, içerik serialize olacak :: fetchAll ();

Biçim parametresi ya url "/ benim / index / format / json" veya "/ benim / index? Format = json" get sorgu ile geçilebilir

Gerçek büyü bağlam anahtarı aynı zamanda içerik türü olarak tepki türü için uygun başlıklarını, ayarlar olmasıdır.

You can even specify your own contexts, and the headers to send. Read more about the context switch here

Her şeyden önce, iş mantığı Modeli, değil Kontrolör olmalıdır.

İkincisi, benim ajax istekleri yaygın biçimi bu tür var:

if ($ajax = $this->getRequest()->isXMLHttpRequest()) {
  $this->_helper->layout->disableLayout();   
};

// then later - if its responding with json:

  if ($ajax)
  {
    $this->_helper->viewRenderer->setNoRender(true);     
    $this->getResponse()->setHeader('Content-Type', 'text/json'); 
    echo $this->view->json($some_return_values);
    return;
  }

Ayrıca - $this->view->render('controller/action.phtml'); kontrolör üzerinden geri dönmek için bir dizeye bir hale PHTML yakalamak için kullanabileceğiniz unutmayın. Bu görünümünde sunum tutmak sağlayacaktır.

Her zaman bir görünüm içinde herhangi bir sunum mantığı bırakmak deneyin. Ben sizin uygulamanız için doğru bir tasarım yaklaşımı gibi bir şey olacağını düşünüyorum:

AjaxController.php:

public function AjaxAction() {
    //do some logic
    //set content to a variable
}

ajax.phtml:

<p><?php //display the content of the variable setted in the controller ?></p>

Daha sonra birbirinden ayrı şeyler bu şekilde denemek hatta belki de, vb oluşturulan içerik benzer bazı ajax için görünümü rehuse, ayrı ayrı görünüm veya eylem düzenlemek, bu MVC deseni ile çalışmak üzere tasarlanmış bir yoldur.