如何在 Zend 2 中将参数从模型传递到布局?

How do I pass a parameter from model to layout in Zend 2?

我想要实现的是从我的模型中的数据库中提取一些数据并将其发送到布局,我的主菜单所在的位置。我想在从模型中获得该参数的值后更改该菜单。 这是 class 模块内容:

namespace Application;

use Zend\Mvc\ModuleRouteListener;
use Zend\Mvc\MvcEvent;

class Module
{
    public function onBootstrap(MvcEvent $e)
    {
        $eventManager        = $e->getApplication()->getEventManager();
        $moduleRouteListener = new ModuleRouteListener();
        $moduleRouteListener->attach($eventManager);

       // $serviceManager = $e->getApplication()->getServiceManager();

        $viewModel = $e->getApplication()->getMvcEvent()->getViewModel();
        //$x = new UserController();
        // $var =  $x->getUserSession();
        // $viewModel->someVar = $var;
    }

    public function getConfig()
    {
        return include __DIR__ . '/config/module.config.php';
    }

    public function getAutoloaderConfig()
    {

        return array(
            'Zend\Loader\StandardAutoloader' => array(
                'namespaces' => array(
                    __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
                ),
            ),
        );
    }
    public function getServiceConfig() {
        return array(
            'factories' => array(
                'Application\Model\UsersTable' => function($sm) {
                    $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                    $table = new Model\UsersTable($dbAdapter);
                    return $table;
                },
            ),
        );
    }
}

有的说可以用Helper,有的说必须修改onBootstrap函数。这真的把我的脑袋搞得一团糟。你能给我举个例子吗?我如何让它工作?谢谢

您可以执行以下操作:

    public function onBootstrap(MvcEvent $e)
    {
        $sharedEvents = $e->getApplication()->getEventManager()->getSharedManager();
        $sharedEvents->attach(__NAMESPACE__, 'dispatch', function($e) {
        $controller = $e->getTarget();
        $data = $controller->getServiceLocator()->get('Application\Model\UsersTable')->functionToGetData();
        $controller->layout()->data= $data;
    }, 100); 
}

然后 $data 参数可用于您的布局。当你说布局时要清楚,我假设你指的是默认布局

更新:我发现很难表达我的理解方式,因此为了避免混淆,我将从文档和其他来源中引用一些理论来帮助我理解上述内容。你应该阅读我最后提供的参考资料,你会明白的。

onBootstrap() 方法会在每次页面请求时为实现此功能的每个模块调用,并且应该仅用于执行轻量级任务,例如注册事件侦听器。

EventManager 只有在触发某些事件时才真正有趣。

基本触发需要三个参数: - 事件名称,通常是当前 function/method 名称; - 目标,通常是当前对象实例; - arguments,通常是提供给当前function/method

的参数

反过来,触发事件只有在监听事件时才有意义。

侦听器附加到 EventManager,指定命名事件和要通知的回调。回调接收一个事件对象,该对象具有用于检索事件名称、目标和参数的访问器。让我们添加一个侦听器,并触发事件。

共享事件管理器是一个跨应用程序唯一的管理器,它被注入到每个事件管理器中

换句话说,onBootstrap 方法将使用 sharedEvents 附加事件,然后触发它们。为了更好地理解这些概念,请查看以下参考资料。

The MvcEvent

Module Manager Listeners

The EventManager

Understanding the Zend Framework 2 event manager