MVC基础知识:将工作传递给视图?

时间:2012-04-10 16:34:49

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

我正在使用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等)或在控制器中执行所有操作并使视图仅进行格式化和显示。

3 个答案:

答案 0 :(得分:2)

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

$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循环是好的,但是如果将业务逻辑保存到控制器和模型中则是最好的。希望对你有意义。

答案 1 :(得分:1)

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

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

现在,如果你想要一个循环来在表格中显示数据,那就是在视图中完成“真正的工作”,但是因为它是格式化和显示的一部分是可以接受的。

答案 2 :(得分:1)

关于你的第一个问题,它实际上非常简单:

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

在视图中,您可以访问以下内容:

$firstname;
$array;
$multidimensional_array;

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

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

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

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