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

时间:2015-01-18 14:29:02

标签: layout zend-framework2

我想要实现的是从我的模型中的db中提取一些数据并将其发送到布局,我的主菜单位于何处。我希望在从模型中获得该参数的值之后更改该菜单。 这是课程模块内容:

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功能。这真是搞砸了我的全部头脑。你能举个例子说明我该如何运作? thx

1 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

    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触发某些事件,它真的很有趣。

基本触发有三个参数: - 事件名称,通常是当前的函数/方法名称; - 目标,通常是当前对象实例; - 参数,通常是提供给当前函数/方法的参数

反过来,触发事件只有在某事正在侦听事件时才会引起注意。

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

共享事件管理器是一种管理,它在整个应用程序中是唯一的,并且被注入每个事件管理器

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

The MvcEvent

Module Manager Listeners

The EventManager

Understanding the Zend Framework 2 event manager