Zend MVC Zend_Form kullanmanın daha iyi yolları

3 Cevap php

Zend_Form kullanırken kendimi bu benzeyen denetleyicisi yöntemleri bir sürü oluşturarak bulmak:

function editPersonAction()
{
   $model = $this->getPersonModel();
   $form = $this->getPersonEditForm();
   if ($this->getRequest()->isPost() {
       $data = $this->getRequest()->getPost();
       //$form->populate($data); [removed in edit]

       if ($form->isValid($data)) {
           $data = $form->getValues();
           $model->setFromArray($data);
           // code to save model then decide which page to redirect to
       }
   } else {
       $form->populate($model->toArray());
   }
   $this->view->form = $form;
}

Bu kodu çoğu zaman aynı olduğunu ve bunu yapmak için daha iyi yollar vardır eminim. Başka ne desen insanlar kullanılıyor Demirbaş kod miktarını azaltmak için Zend_Form ile kullanabilirim?

3 Cevap

I modellerde mümkün olduğunca tutmak gibi

function editPersonAction()
{
   $model = $this->getPersonModel();

   if ($this->getRequest()->isPost() {
       $data = $this->getRequest()->getPost();

       if ($model->validateForm($data)) {
           // code to save model then decide which page to redirect to
       } else {
          // error management
       } 
   } 

   $this->view->form = $model->getForm();
}

Öyleyse modelinde I olurdu:

public function validateForm(array $data)
{    
    $form = $this->getForm();

    if($form->isValid($data))
    {
        // code to save model state

        return true;
    } else {
        return false;
    }
}

public function getForm($instance = 'default') {
   if (!isset($this->_forms[$instance])) {
       $this->_forms[$instance] = new Your_Form_Class();           
       $this->_forms[$instance]->populate($this->toArray());
   }

   return $this->_forms[$instance];
}

Plus, tüm uygulama modelleri uzanacak soyut bir modele bu yöntemleri ekleyin ve size özel bir şey yapmak gerektiğinde sonra sadece onları üzerine yazabilirsiniz.

$ Form-> populate) gerçekten gerekli (mi? IIRC geçerli olmayan formları automagically doldurulur alacak.

Dürüst olmak gerekirse, ben de benim denetleyicileri benzer görünümlü eylemler var. Ben denetleyicisi ve kongre yoluyla kilo aşağı tutmak için yapılacak tek şey, modelin kontrol doğrulama yapmaktır. Ben de (zaten Controller'daki getPersonEditForm yöntemi ile bu yapıyor olabilir bu kolaylaştırmak için model form nesnesini çağırır Ben eyleminizi yazılı olsaydı, bu gibi görünecektir So.:

function editPersonAction()
{
   $model = $this->getPersonModel();
   $form  = $this->getPersonEditForm();

   if($this->getRequest()->isPost()) 
   {
       if($model->setFromArray($this->getRequest()->getPost()))
       {
           // code to decide which page to redirect to
       }
   }
   else
   {
       $form->populate($model->toArray());
   }

   $this->view->form = $form;
}

Öyleyse modeli yöntemi setFromArray I olurdu:

public function setFromArray(array $data)
{
    $form = $this->getRegistrationForm();

    if($form->isValid($data))
    {
        // code to save model state

        return true;
    }
    else
    {
        return false;
    }
}

Kuşkusuz, önemli ölçüde daha özlü mevcut yaklaşım ve benden değil, sizin gibi, genellikle bu iyi soyutlanmış olabilir hissediyorum.