布局zf2中的动态内容


dynamic content in layout zf2

我正在开发一个应用程序与zf2,其中有doctrin2,但我有一个问题。在应用程序的每个页面上必须插入一个包含新闻的块,以便从数据库中检索数据。为了避免在每个动作中重复它,我想我会把这个块放在布局中,但我不知道如何在布局中访问数据库。

为此,我创建了一个视图助手,但我不知道如何访问实体管理器来创建NativeQuery的实例

我的目标主要是继续将表示从逻辑中分离出来,但是我没有找到关于如何正确解决这个问题的很多信息。

我们携带用于创建帮助器

的代码
use Zend'View'Helper'AbstractHelper;
use Doctrine'ORM'EntityManager as em;
use Doctrine'ORM'NativeQuery as nq;
use Doctrine'ORM'Query'ResultSetMapping as ResultSetMapping;
use Doctrine'ORM'Query'ResultSetMappingBuilder as ResultSetMappingBuilder;
use Admin'Entity'SiteNews;

class Newshelper extends AbstractHelper {
    public function __invoke($str, $find)
    {
        $rsm = new ResultSetMapping();
        $rsm->addEntityResult('Admin'Entity'Sitenews', 'u');
        $rsm->addFieldResult('u', 'id_news', 'idNews');
        $rsm->addFieldResult('u', 'autore', 'autore');
        $rsm->addFieldResult('u', 'news', 'news');
        //$nq = new nq("SELECT * FROM site_news ORDER BY rand() LIMIT 10",$rsm);
        $nativeQuery = $em->createNativeQuery("SELECT * FROM site_news ORDER BY rand() LIMIT 10",$rsm);
        $news = $nativeQuery->getResult();
        $out = "";
        foreach($news as $c){
            $out .="<li data-author='"" . $c->getAutore() . "'">" . $c->getNews() . "</li>";
        }
        return $out;
    }
} 

助手工作正常,但我不知道如何访问实体管理器。实现这一点的最佳方式是什么?

可以在这里添加其他信息。以这种方式在布局文件中调用我的帮助器

$this->newshelper($sm)

和添加你的代码,但我有错误

注意:未定义变量:sm在www'httpdocs'ciro'module'Application'view'layout'layout。php on>line 96

警告:Application'View'Helper'newshelper::__construct()缺少参数1,在>D:'www'httpdocs'ciro'vendor'zendframework'zendframework'library'Zend'ServiceManager'AbstractPluginMa>nager.php第170行调用,并在>www'httpdocs'ciro'module'Application'src'Application'View'Helper'newshelper.php第24行定义

注意未定义变量:sm在>www'httpdocs'ciro'module'Application'src'Application'View'Helper'newshelper.php第25行

致命错误调用>'www'httpdocs'ciro'module'Application'src'Application'View'Helper'newshelper.php中非对象的成员函数getServiceLocator()

我也试图在模块中插入此代码,但没有结果

$sm = $e->getApplication()->getServiceManager();

要访问视图帮助器中的entitymanager,您应该将服务定位器传递给视图帮助器。你可以在Module.php中传递服务或服务定位器。

public function getViewHelperConfig() {
    return array(
        'factories' => array(
            'myviewhelper' => function ($sm) {
                return new View'Helper'MyViewHelper($sm);
            },
        )
    );
}

和视图帮助

public function __construct($sm) {
    $entitymanager = $sm->getServiceLocator()->get('doctrine.entitymanager.orm_default');
    }
好运