【问题标题】:Database query inside layout or view in zend2在zend2中布局或视图中的数据库查询
【发布时间】:2013-04-19 13:40:42
【问题描述】:

如何在视图中访问 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 初始化数据库连接。

【问题讨论】:

标签: zend-framework2


【解决方案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']); ?>

我希望它有所帮助。一旦您开始使用从单独层获取数据的架构并开始运行,您就会开始理解为什么这是最佳实践。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 2013-02-12
    • 2020-05-27
    相关资源
    最近更新 更多