如何在视图中访问zend数据库连接。
在我的情况下,我的USERS index.phtml显示所有用户的列表,USER注册了多种语言,这些语言以JSON格式存储在数据库中
这是indexAction。
return new ViewModel(array(
'users' => $this->getRegisterTable()->fetchAll(),
));
在index.phtml里面
<?php foreach ($users as $users):?>
<?php
$getQuery = mysql_query("SELECT * FROM lang where id= $users->lang ");
$getResult = mysql_fetch_array($getQuery);
$lang = "<a href='" . $this->url(lang , array('action'=>'detail', 'id'=> $users->lang )) . "'>" .$getResult['name']."</a>";
?>
<?php endforeach;?>
因此要执行此查询,我必须使用MYSQL_CONNECT手动初始化数据库连接
但我希望它只访问zend初始化数据库连接。
答案 0 :(得分:1)
正如其他人所说的那样,这是一件非常糟糕的事情。这些数据应该从您的控制器发送到视图,您的视图不应该使用数据库,甚至不知道正在使用数据库。通过打破MVC(模型视图控制器)设计模式,您的代码将更难以维护和理解。
如果我理解您要正确执行的操作,那么您希望显示用户已注册的语言。我会在提取用户时获取此信息,以便您的User
模型上提供这些语言。如果您使用Mapper类从中获取用户,那么您可以在此处获取语言。然后在你看来,你应该这样做:
<?php foreach ($users as $user) : ?>
<?php foreach ($user->getLanguages() as $language) : ?>
<?php $lang = "<a href='" . $this->url('lang' , array('action'=>'detail', 'id'=> $language['id'] )) . "'>" . $language['name'] . "</a>"; ?>
<?php endforeach; ?>
<?php endforeach; ?>
现在,您的演示文稿(视图)层中不再具有业务逻辑或数据访问逻辑。请记住使用escape
视图帮助程序从数据库中转义数据,如下所示:
<?php echo $this->escape($language['name']); ?>
我希望它有所帮助。一旦您启动并运行了从单独的层获取数据的架构,您就会开始理解为什么这是最佳实践。