如何在ZF2中全局传递变量到layout.phtml?

Mil*_*ari 28 zend-framework2

我想在整个应用程序(全局)中将一系列变量传递给我的layout.phtml.我的意思是我不想用

$this->layout()->someVar = someValue;
Run Code Online (Sandbox Code Playgroud)

在我所获得的每一个动作中,因为这将是许多额外的工作和代码.那么有没有办法在一个地方做到这一点?或者我提到的就是我得到的一切!希望不是 :)

也许使用会话? - 雷米托马斯

谢谢你的解决方案.暂时这就是我正在使用的东西.用于登录用户信息,系统和布局设置以及ACL列表.但问题是我必须在layout.phtml中定义一个我认为不合适的新对象,是吗?我在某处读到,我们需要在视图模型中使用的任何数据都应该使用控制器操作传递给它.特别是我不喜欢偷工减料,所以如果有一个干净的方法,我宁愿不这样做.最近我必须为每个用户获取未读消息的数量,并在layout.phtml中使用它.所以,如果我在layout.phtml中这样做,那么在视图模型或布局中有很多php脚本.

谢谢

小智 41

正如Orochi所说,最好和最干净的方法是使用ViewHelper.这里有一些创建自己的ViewHelper的说明:http://framework.zend.com/manual/2.2/en/modules/zend.view.helpers.advanced-usage.html.它不是太复杂;)

但是,您的问题也可以通过其他方式解决.假设您需要的变量包含应用程序中已存在的服务提供的值(然后由ZF2 ServiceManager公开),您可以在Module.php中的"onBoostrap"函数中添加一些行(例如,在Application模块上).

这是一个例子:

public function onBootstrap($e) {

    $serviceManager = $e->getApplication()->getServiceManager();
    $viewModel = $e->getApplication()->getMvcEvent()->getViewModel();

    $myService = $serviceManager->get('MyModule\Service\MyService');

    $viewModel->someVar = $myService->getSomeValue();

}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您只能在一个地方编写作业.然后可以像往常一样访问变量:

$this->layout()->someVar;
Run Code Online (Sandbox Code Playgroud)


Tim*_*rez 35

这正是你想要的......

// Do this inside your Controller before you return your ViewModel
$this->layout()->setVariable('stack', 'overflow');

// Then inside your layout.phtml
echo $this->stack;
Run Code Online (Sandbox Code Playgroud)

没有视图助手,没有事件管理器,没有服务管理器或其他类方法杂耍.为什么Stack上的人有时会让事情变得复杂?

  • 谢谢老兄,但我已经知道了.问题是,在哪个控制器内,一劳永逸地做到这一点!即只在一个地方做,但可以在任何地方访问,正确的答案是你不在控制器中做到这一点.哪个stefanovalle友好地提供了onBootstrap解决方案.不管怎么说,多谢拉 :) (3认同)