我正在使用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等)或在控制器中执行所有操作并使视图仅进行格式化和显示。
答案 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或循环可能很有用,例如,如果要根据特定变量显示不同的消息,或者想要用一堆行填充表。但是,我强烈建议您尽可能多地保留逻辑。该视图旨在接收所需的所有数据,并以适合它的方式显示它。
这有很多原因,即可维护性(如果您的逻辑发生变化,您不需要更新视图),可重用性(如果您尽可能地提供视图,您可以非常轻松地重用它们)甚至能够创建新视图或用不同的视图替换该视图,而不必担心逻辑。
我希望这会有所帮助。 :)