1

我正在使用 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 等),还是在控制器中完成所有这些工作,让视图只进行格式化和显示。

4

3 回答 3

2

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

$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 循环很好,但最好将业务逻辑保留在控制器和模型中。希望它对你有意义。

于 2012-04-10T16:48:17.747 回答
1

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

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

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

于 2012-04-10T16:48:22.300 回答
1

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

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

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

$firstname;
$array;
$multidimensional_array;

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

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

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

我希望这有帮助。:)

于 2012-04-10T16:54:41.313 回答