【问题标题】:How to pass data from model to view(or to controller)如何将数据从模型传递到视图(或控制器)
【发布时间】:2012-03-19 09:08:13
【问题描述】:

问题很简单: 如何将数据从模型传递到视图(或传回控制器)以显示诸如“您的密码太短”之类的错误

这是控制器

class UsersController extends Controller {

    private $username;
    private $password;

    function register()
    {
        if($_POST)
        {
            $this->User->username = $_POST['username'];
            $this->User->password = $_POST['password'];
            $this->User->register();
        }
    }



}

模型

class User extends Model {

    public $username;
    public $password;

    function register()
    {
        $username = $this->username;
        $password = $this->password;

        if (!empty($username) && !empty($password))
        {
            // registration process
        }
        else
        {
            // "you must provide a username and password" or something like that
        }
    }

【问题讨论】:

    标签: php model-view-controller validation model


    【解决方案1】:
    public function addAction()
    {
        $form = $this->_getForm();
        $this->view->form = $form;
        $this->render('add', null, true);
    }
    
    public function editAction()
    {
        $id = $this->getRequest()->getParam(0);
        $Model = DI::get('yourclass_Model');
        $form = $this->_getForm();
        $data = $Model->getData();
        $form->populate($data);
        $this->view->flashMessages = $this->_helper->FlashMessenger->getMessages();
        $this->view->form = $form;
        $this->render('add', null, true);
    }
    
    public function saveAction()
    {
        $form = $this->_getForm();
        $Model = DI::get('yourclass_Model');
        try{
        $saved = $Model->saveForm($form, $_POST);
        } catch (Exception $e) {
           echo "<pre>";
           print_r($e);
           exit;
        }
        if($saved)
        {
            $this->_helper->FlashMessenger('Record Saved!');
            $this->_redirect("edit".$form->id->getValue(), array('exit'=>true));
        } 
        $this->view->errorMessage = 'There were some errors';
        $this->view->form = $form;
        $this->render('add', null, true);
    }
    

    【讨论】:

      【解决方案2】:

      只需将模型return "PASSWORD"; 中的register 函数传递给控制器​​,然后让控制器从模型中获取返回值并将其返回到视图中。让视图解释“PASSWORD”的错误输出是什么。

      例子:

      控制器

      class UsersController extends Controller {
      
          private $username;
          private $password;
      
          function register()
          {
              if($_POST)
              {
                  $this->User->username = $_POST['username'];
                  $this->User->password = $_POST['password'];
                  return $this->User->register();
              }
          }
      }
      

      型号

      class User extends Model {
      
          public $username;
          public $password;
      
          function register()
          {
              $username = $this->username;
              $password = $this->password;
      
              if (!empty($username) && !empty($password))
              {
                  // ...
                  return "SUCCESS";
              }
              else
              {
                  return "PASSWORD";
              }
          }
      }
      

      视图

      $responses = array("SUCCESS" => "Registered Successfully!", "PASSWORD" => "You must provide a username and password!");
      
      $result = $this->UsersController->register();
      echo $responses[$result];
      

      【讨论】:

        【解决方案3】:

        只需让您的模型方法返回值或抛出异常,就像任何普通方法一样。然后在控制器中处理它。视图不应该直接接触模型中的数据,这是控制器的工作。

        【讨论】:

          【解决方案4】:

          创建一个实现单例模式和 ArrayAccess 接口的类。 或者使用依赖注入创建类似的东西。

          最终的解决方案是创建一些验证架构。 (模型对其自身进行验证,并且它的错误状态在视图中可用。)

          【讨论】:

          • 这与 MVC 相差甚远 FAR。坏主意。
          • 模型可以从它的方法中返回任何可以被控制器插入到“全局”容器中的东西。我不明白为什么这么糟糕。
          • 我知道单例是一种反模式,这就是我提到依赖注入的方式。如果您将相同的(例如)ViewData 实例注入当前控制器并查看,那么您在两层之间有一个易于使用的通信渠道,并且您没有全局对象。
          • MVC 很简单。控制器收到请求。调用模型方法,从模型方法中获取结果,相应地调用视图。我看不出单例可以放在哪里......
          • 这取决于您如何对待视图。在 Zend Framework 中,不需要任何其他对象来保存数据,因为一切都简单地传递给当前视图。例如,在我自己的框架中,直到控制器的方法执行结束(或至少在某个点停止),我才拥有任何 View 对象。顺便说一下,视图不是用来保存任何数据的,它只是向消费者展示东西。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-25
          • 2013-07-08
          • 2013-11-20
          • 1970-01-01
          • 1970-01-01
          • 2013-06-05
          相关资源
          最近更新 更多