我正在开发一个应用程序与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');
}
好运