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


MVC Fundamentals: Passing work along to the view?

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

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

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

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

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

现在,如果你想有一个循环来显示表中的数据,那就是在视图中完成的"实际工作",但由于它是格式和显示的一部分,这是可以接受的。

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

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

在视图中,您可以按以下方式访问这些内容:

$firstname;
$array;
$multidimensional_array;

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

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

这有很多原因,即可维护性(

如果您的逻辑发生变化,则无需更新视图)、可重用性(如果您使视图尽可能通用,您可以非常轻松地重用它们)甚至创建新视图或将该视图替换为其他视图的能力,而无需担心逻辑。

我希望这有帮助。:)