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

Zend framework2 如何在ZF2中全局地将变量传递到layout.phtml?,zend-framework2,Zend Framework2,我希望在整个应用程序中(全局)向layout.phtml传递一系列变量。我的意思是我不想使用 $this->layout()->someVar = someValue; 在我所做的每一个动作中,都会有很多额外的工作和代码。那么,有没有一种方法可以在一个地方做到这一点?或者我所说的就是我所得到的!希望不是:) 也许使用会话?——雷米·托马斯 谢谢你的解决方案。目前这就是我正在使用的。用于登录用户信息、系统和布局设置以及ACL列表。但问题是我必须在layout.phtml中定义一个新对

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

$this->layout()->someVar = someValue;
在我所做的每一个动作中,都会有很多额外的工作和代码。那么,有没有一种方法可以在一个地方做到这一点?或者我所说的就是我所得到的!希望不是:)


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

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


感谢您为此创建自己的ViewHelper

编辑:

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

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

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

正如Orochi所建议的,最好、最干净的方法是使用ViewHelper。以下是创建自己的ViewHelper的一些说明:。不太复杂;)

但是,您的问题也可以通过另一种方式解决。 假设您需要的变量包含应用程序中已经存在的服务(然后由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;

这正是你想要的

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

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

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

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


在应用程序/Module.php中

第1步:

use Zend\ModuleManager\Feature\AutoloaderProviderInterface;
use Zend\ModuleManager\Feature\ConfigProviderInterface;
use Zend\Mvc\MvcEvent;
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....

}
第二步:

use Zend\ModuleManager\Feature\AutoloaderProviderInterface;
use Zend\ModuleManager\Feature\ConfigProviderInterface;
use Zend\Mvc\MvcEvent;
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....

}
第三步:

use Zend\ModuleManager\Feature\AutoloaderProviderInterface;
use Zend\ModuleManager\Feature\ConfigProviderInterface;
use Zend\Mvc\MvcEvent;
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....

}
在layout.phtml文件中 将变量用作
$this->变量名


我希望这对您的应用程序/Module.php有所帮助。

1) 为zend framework创建一个调度事件,如下所示:

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

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

也许可以使用会话?谢谢,尽管我觉得这对我来说太高级了:D.我会做一些研究然后回到这里。谢谢Stefan,我真的很感激。我目前正忙于应用程序的另一个优先部分。但几天后我肯定会尝试这些解决方案。但现在,我想onBootstrap正是我需要的。我来测试一下。再次感谢兄弟:)好帖子!工作起来很有魅力!谢谢,伙计,但我早就知道了。问题是,在哪个控制器中,一次又一次地完成它!i、 e.只在一个地方进行,但在任何地方都可以访问,正确的答案是你不在控制器中进行。stefanovalle善意地提供了onBootstrap解决方案。无论如何,谢谢:)因为您的简单解决方案是不可伸缩的。Zend 1.12的错误:方法“layout”不存在,并且没有被困在这里的_call()向下投票中,因为此代码不起作用,实际上也不是正确的方法。1) $controller未定义,应该从MvcEvent获取,但不是。2) 您应该通过控制器访问布局。直接通过MvcEvent的视图模型获取它,正如这个问题上公认的答案所示。我在这里只定义了$controller变量,现在代码还行。有时,您希望向模块中的每个操作添加一些全局变量。以防万一,你可以采用这种方法。就像您可以通过这个技巧添加经过身份验证的用户变量,以使您的用户参与模块的每个操作一样