【问题标题】:MVC Fundamentals: Passing work along to the view?MVC 基础知识:将工作传递给视图?
【发布时间】:2012-04-10 16:34:48
【问题描述】:

我正在使用 Doctrine2 和 CodeIgniter2,并且对两者以及 OOP/MVC 都是新手,所以请使用简单的解释 :)

出于测试目的,我有一个控制器、模型和视图。我想显示包含用户信息的表中的数据。名字、姓氏、身份证号码等。

我的控制器调用模型——它从理论实体中检索数据,然后控制器将该数据传递给视图。

(控制器)

class Test_v_to_m extends CI_Controller {

    public function index() {

        $this->load->model('testing/test_v_to_m_model');
        $data = $this->test_v_to_m_model->display_user_info();

        $this->load->view('testing/test_v_to_m_view', $data );
    }
}

(型号)

class Test_v_to_m_model extends CI_Model{

public function display_user_name() {

    $query = $this->doctrine->em->createQuery("select u from ORM\Dynasties2\Users u");
    return $query->getResult();

(查看)

//print_r($data);

第一个问题是:如何以有用的方式将对象或数组传递给视图?如果我只处理一个变量,这很有效:

(控制器)

$user = $this->doctrine->em->find('Entities\User', $user_id);
$data['firstname'] = $user->getFirstName();
$this->load->view('testing/test_v_to_c_view_2',$data);

(查看)

echo $firstname;

但是当它是一个数组或多维数组时,我不知道如何做类似的事情。

第二个问题是是否让视图做任何真正的工作(php 逻辑、循环、foreach 等),还是在控制器中完成所有这些工作,让视图只做格式化和显示。

【问题讨论】:

    标签: php arrays model-view-controller codeigniter doctrine


    【解决方案1】:

    是的,您可以将多维数组传递给视图,然后根据需要访问它。 例如

    $template_date['result_arr'] = array(
    array('firstname' => 'abc', 'lastname' => 'xyz')
    , array('firstname' => 'abc', 'lastname' => 'xyz')
    );
    

    在您的视图文件中 -

    foreach($result_arr as $key => $row) {
    echo $row['firstname'].' <br />';
    }
    

    关于您的第二个问题 - 根据我的理解 - 在视图中使用一些 foreach、for 循环很好,但最好将业务逻辑保留在控制器和模型中。希望对你有意义。

    【讨论】:

    【解决方案2】:

    至于你的第一个问题,我不知道我脑海中的答案(对不起!)。但是,我想一个数组可以作为数据的一部分(作为单个项目)传递,但是您需要在视图中迭代它(见下文)。不过只是猜测……

    关于你的第二个问题,MVC 的原则是视图中只有显示逻辑 - 所以所有“实际工作”都应该在控制器中完成。

    现在,如果您希望有一个循环来显示表格中的数据,那是在视图中完成的“实际工作”,但因为它是格式化和显示的一部分,所以可以接受。

    【讨论】:

      【解决方案3】:

      关于你的第一个问题,其实很简单:

      $data = array(
          'firstname' => 'string',
          'array' => array(1, 2, 3),
          'multidimensional_array' => array('ocean' => 'deep')
      );
      

      在视图中,您可以通过以下方式访问它们:

      $firstname;
      $array;
      $multidimensional_array;
      

      它们只是导出到视图中,因此您可以将 $data 数组中的每个键视为变量,将 $data 数组中的值视为变量的值。

      关于第二个问题,通常最好让视图只进行格式化和显示。在某些情况下,使用 ifs 或循环可能很有用,例如,如果您想根据某个变量显示不同的消息,或者如果您想用一堆行填充表格。但是,我强烈建议您尽可能多地避开逻辑。该视图旨在接收它需要的所有数据并以适合它的方式显示它。

      这有很多原因,即可维护性(如果您的逻辑发生更改,则无需更新视图)、可重用性(如果您使视图尽可能通用,则可以非常轻松地重用它们)甚至能够创建新视图或用不同的视图替换该视图,而无需担心逻辑。

      我希望这会有所帮助。 :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-26
        • 2011-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-07
        • 1970-01-01
        相关资源
        最近更新 更多