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

时间:2013-08-26 08:00:23

标签: zend-framework2

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

$this->layout()->someVar = someValue;

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

  

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

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

由于

6 个答案:

答案 0 :(得分:40)

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

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

这是一个例子:

public function onBootstrap($e) {

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

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

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

}

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

$this->layout()->someVar;

答案 1 :(得分:33)

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

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

// Then inside your layout.phtml
echo $this->stack;

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

答案 2 :(得分:2)

为此创建自己的ViewHelper。

编辑:

我就是这样做的:在Module的src文件夹中,我创建了新的View文件夹,然后在这个View文件夹中创建了另一个名为Helper的文件夹。在这个文件夹中,我创建了我的帮助程序类。因此,例如,我创建了Navigation.php文件。在这个文件中,我创建了一个名为Navigation的类,它从AbstractHelper扩展(使用Zend \ View \ Helper \ AbstractHelper)。然后我在公共函数__invoke()中编写代码,它也返回一些结果。您还必须将视图助手类添加到模块的config / module.config.php中的'view_helpers',类似于:

'view_helpers' => array(
    'invokables' => array(
        'nav' => 'Application\View\Helper\Navigation',
    ),
),

然后,您可以在视图或布局中的任何位置调用“导航”作为方法,例如nav();?>

答案 3 :(得分:2)

在您的Application / Module.php中 1)为zend框架创建一个Dispatch事件,如下所示:

public function onBootstrap(MvcEvent $e)
{ 
    $eventManager        = $e->getApplication()->getEventManager();
    $eventManager->attach('dispatch', array($this, 'loadConfiguration' ));
}    
public function loadConfiguration(MvcEvent $e)
{           
      $controller = $e->getTarget();
      $controller->layout()->YOUR_VARIABLE_NAME = $YOUR_VALUE;
}

2)现在您可以在布局中访问您定义的变量,如下所示:     $这 - > YOUR_VARIABLE_NAME;

答案 4 :(得分:0)

您可以使用ModuleManager将全局变量从ZendFramework 2中的Application / Module.php传递到您的布局,如下所示:

在您的Application / Module.php

第1步:

use Zend\ModuleManager\Feature\AutoloaderProviderInterface;
use Zend\ModuleManager\Feature\ConfigProviderInterface;
use Zend\Mvc\MvcEvent;

第2步:

class Module implements AutoloaderProviderInterface, ConfigProviderInterface
{    
    public function onBootstrap(MvcEvent $e)
    { 
        $eventManager        = $e->getApplication()->getEventManager();
        $eventManager->attach('dispatch', array($this, 'loadConfiguration' ));
    }    
    public function loadConfiguration(MvcEvent $e)
    {           
          $controller = $e->getTarget();
          $controller->layout()->YOUR_VARIABLE_NAME = $YOUR_VALUE;
    }


  // Your remaining code here....

}

第3步:

在layout.phtml文件中 将您的变量用作$this->YOUR_VARIABLE_NAME

我希望这会有所帮助。

答案 5 :(得分:0)

为什么不通过设置布局变量的基本控制器使用继承来抽象可重复配置。由于重用是这里的主要关注点,基本的OOP应该足够了。 Zend不必做任何事情:)。