我正在使用ZF2开发网站。页脚中的一个部分包含推文。我可以获取推文,但我不知道如何在布局中显示它们。我有以下想法但不确定使用哪种方法
ServiceLocator
获取推文并在布局中调用帮助MvcEvent::EVENT_RENDER
,该事件将html设置为布局变量。如果还有其他更好的方法,请告诉我。
答案 0 :(得分:1)
您完全引用的是 ViewHelper 的任务。所以你的第二种方法是正确的。你有两层
ServiceLayer - 从DB / Twitter / DataSource获取推文
ViewLayer - 显示ServiceLayer为您提供的任何内容
现在问题是你想做什么?你想拥有一个简单地呈现一些给定推文的ViewHelper吗?然后,您不需要访问TweetService
本身,而是访问给定的数据。像这样:
'view_helpers' => array(
'factories' => array(
'tweetRenderer' => function ($vhm) {
$tweetService = $vhm->getServiceLocator()->get('my-tweetservice');
$tweetRenderer = new \My\View\Helper\TweetRenderer();
return $tweetRenderer->render(
$tweetService->getAllTweets()
);
}
)
)
// in your view then:
echo $this->tweetRenderer();
但最常见的事情并不是那么方便。您可能希望能够至少更改要呈现的推文的用户名。因此,您需要将实际TweetService
注入ViewHelper,然后使用ViewHelper的__invokable()
函数为渲染器设置参数:
'view_helpers' => array(
'factories' => array(
'tweetRenderer' => function ($vhm) {
$tweetService = $vhm->getServiceLocator()->get('my-tweetservice');
return new \My\View\Helper\TweetService($tweetService);
}
)
)
// TweetService.php
public function __construct(TweetServiceInterface $tweetService) {
$this->tweetService = $tweetService;
}
public function __invoke($username) {
return $this->render(
$this->tweetService->fetchTweetsForUser($username)
):
}
// in your view then:
echo $this->tweetRenderer('manuakasam');
这就是基础知识:)