我正在使用 ZF2 开发一个站点。页脚中的一个部分包含推文。我可以获取推文,但我不确定如何在布局中显示它们。我有以下想法,但不确定使用哪种方法
- 创建一个控制器插件并在每个请求上使用它。
- 创建一个 ViewHelper 从 获取推文
ServiceLocator
并在布局中调用助手 - 将一个事件附加到
MvcEvent::EVENT_RENDER
module.php 中,它将 html 设置为布局变量。
如果还有其他更好的方法,请告诉我。
我正在使用 ZF2 开发一个站点。页脚中的一个部分包含推文。我可以获取推文,但我不确定如何在布局中显示它们。我有以下想法,但不确定使用哪种方法
ServiceLocator
并在布局中调用助手MvcEvent::EVENT_RENDER
module.php 中,它将 html 设置为布局变量。如果还有其他更好的方法,请告诉我。
您所指的完全是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');
这就是基础知识:)