ZF2如何在布局中显示推文

时间:2013-09-13 16:16:22

标签: zend-framework2 zend-layout

我正在使用ZF2开发网站。页脚中的一个部分包含推文。我可以获取推文,但我不知道如何在布局中显示它们。我有以下想法但不确定使用哪种方法

  1. 创建一个控制器插件并在每个请求中使用它。
  2. 创建一个ViewHelper,从ServiceLocator获取推文并在布局中调用帮助
  3. 将事件附加到module.php中的MvcEvent::EVENT_RENDER,该事件将html设置为布局变量。
  4. 如果还有其他更好的方法,请告诉我。

1 个答案:

答案 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');

这就是基础知识:)