【问题标题】:How to pass variables to layout.phtml globally in ZF2?如何在 ZF2 中将变量全局传递给 layout.phtml?
【发布时间】:2013-08-26 08:00:22
【问题描述】:

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

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

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

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

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

谢谢

【问题讨论】:

  • 也许使用会话?

标签: zend-framework2


【解决方案1】:

正如 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;

【讨论】:

  • 谢谢斯特凡,我真的很感激。我目前正忙于申请的另一个优先部分。但几天后我肯定会尝试这些解决方案。但是现在,我想 onBootstrap 正是我所需要的。我会测试它。再次感谢兄弟:)
  • 好帖子!像魅力一样工作!
【解决方案2】:

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

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

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

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

【讨论】:

  • 谢谢老兄,但我已经知道了。问题是,在哪个控制器中,一劳永逸地做到这一点!即只在一个地方做,但在任何地方都可以访问,正确的答案是你不要在控制器中做。哪个 stefanovalle 好心地提供了 onBootstrap 解决方案。无论如何谢谢:)
  • 因为您的简单解决方案不可扩展。
  • Zend 1.12 的错误:方法“布局”不存在并且没有被困在 __call() 中
【解决方案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();?>

【讨论】:

  • 谢谢,虽然我想这对我来说太先进了 :D。我会做一些研究然后回到这里。
【解决方案4】:

在您的 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;

【讨论】:

    【解决方案5】:

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

    我希望这会有所帮助。

    【讨论】:

    • 在这里投反对票,因为此代码不起作用,实际上也不是正确的方法。 1) $controller 未定义,它应该取自 MvcEvent 但它不是。 2)您应该通过控制器访问布局。正如这个问题的公认答案所暗示的那样,直接通过 MvcEvent 的视图模型获取它。
    • 我只是在这里定义 $controller 变量,现在我认为代码OK。有时您想为模块中的每个操作添加一些全局变量。以防万一您可以采用这种方法。就像您可以通过此技巧添加经过身份验证的用户变量,以使您的用户参与模块的每个操作
    【解决方案6】:

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

    【讨论】:

      猜你喜欢
      • 2014-05-14
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多