28

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

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

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

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

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

谢谢

4

6 回答 6

42

正如 Orochi 建议的那样,最好和最干净的方法是使用 ViewHelper。这里有一些创建自己的 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;
于 2013-08-31T15:01:56.377 回答
37

这正是你想要的...

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

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

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

于 2013-12-16T06:32:06.263 回答
3

为此创建您自己的 ViewHelper。

编辑:

我就是这样做的:在模块的 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();?>

于 2013-08-27T00:01:44.513 回答
3

在您的 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)现在您可以像这样在布局中访问您定义的变量: $this->YOUR_VARIABLE_NAME;

于 2015-06-10T11:20:05.680 回答
1

您可以使用 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

我希望这有帮助。

于 2014-01-30T11:51:10.587 回答
0

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

于 2015-08-19T16:02:16.917 回答