Zend 2动态内容在布局中与视图助手

时间:2015-10-13 10:05:05

标签: php zend-framework

我是Zend FW 2的新手,我尝试在布局中显示数据库中的数据,但收到错误:

Catchable fatal error: Argument 1 passed to Application\View\Helper\HotNews::__construct() must be an instance of Zend\Db\Adapter\Adapter, none given, called in C:\xampp\htdocs\webtruonghoc\vendor\ZF2\library\Zend\ServiceManager\AbstractPluginManager.php on line 207 and defined in C:\xampp\htdocs\webtruonghoc\module\Application\src\Application\View\Helper\HotNews.php on li

Module.php中的函数getViewHelperConfig:

public function getViewHelperConfig()
{
    return array(
            'factories' => array(
                    'hotNews' => function($sm) {
                        $adapter = $sm->getServiceLocator()->get('Application\Model\NewsTable');
                        return new HotNews($adapter);
                    },
            ),
    );
}

在module.config.php中添加代码:

    'view_helpers' => array(
            'invokables' => array(
                    'hotnews' => 'Application\View\Helper\HotNews',
            ),

文件HotNews.php:

 <?php


namespace Application\View\Helper;

use Zend\Authentication\AuthenticationService;
use Zend\View\Helper\AbstractHelper;
use Zend\Db\Adapter\Adapter;

class HotNews extends AbstractHelper
{
    protected $adapter;

    public function __construct(Adapter $adapter)
    {
        $this->adapter = $adapter;
    }

    public function __invoke()
    {
        $sql="SELECT * FROM news order by date DESC limit 0,4";
        return $resultSet = $this->adapter->query($sql, \Zend\Db\Adapter\Adapter::QUERY_MODE_EXECUTE);
    }
}

最后我在布局中显示数据:

<?php  $hotnews = $this->hotNews(); 
                            var_dump($hotnews);
                    ?>

我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

看起来您希望将您的模型设置为服务。但可能没有正确设置服务。在你的module.config.php文件中,'service_manager'=&gt;下应该有一个条目。 '工厂':

return array(        
    'service_manager' => array(
        'factories' => array(
            'Application\Model\NewsTable' => function (ServiceLocatorInterface $serviceLocator) {
              //... returns an instance of Application\Model\NewsTable
            }
        )
    )
);

您的SQL中有错误。此外,您不应该在视图助手中执行SQL语句,并且将select *的整个结果集传递给视图也是不好的JuJu。我会将SQL放在一个Repository类中,该类返回表示数据模型的DTO对象。然后,您可以将存储库注入ViewHelper,并在视图中使用这些DTO。