我正在用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.phtml on&gt;第96行
警告缺少Application \ View \ Helper \ newshelper :: __ construct()的参数1,在&gt; D:\ www \ httpdocs \ ciro \ vendor \ zendframework \ zendframework \ library \ Zend \ ServiceManager \ AbstractPluginMa&gt; nager中调用。第170行的php并在第24行的&gt; www \ httpdocs \ ciro \ module \ Application \ src \ Application \ View \ Helper \ newshelper.php中定义
注意未定义的变量:第25行的&gt; www \ httpdocs \ ciro \ module \ Application \ src \ Application \ View \ Helper \ newshelper.php中的sm
致命错误在第25行的&gt; \ www \ httpdocs \ ciro \ module \ Application \ src \ Application \ View \ Helper \ newshelper.php中的非对象上调用成员函数getServiceLocator()
我也尝试在模块中插入此代码,但没有结果
$sm = $e->getApplication()->getServiceManager();
答案 0 :(得分:1)
要访问viewmanper中的entitymanager,您应该传递服务定位器来查看帮助器。您可以在Module.php中传递服务或服务loacator。
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');
}
祝你好运