Zend Framework 2中的全局数据存储

时间:2014-10-14 22:17:38

标签: variables zend-framework layout controller store

我想存储数据,例如。用户名和姓氏以多种布局显示它们。 我想在一个控制器中设置一些变量并在布局中使用它。

任何解决方案?

我创建了一些类似的布局:

<span id="STATUS">LOGGED: <span id="USERNAME"><?php echo $this->name. ' ' . $this->surname; ?></span>

但首先,在控制器的某些操作中,我从数据库中获取名称和姓氏:

$db = $this->getServiceLocator()->get('MyDatabase'); $sql = 'SELECT * FROM Users'; $statement = $db->query($sql);/ $result = $statement->execute();

然后我在控制器中设置静态变量:

self::$name = $result['name']; self::$surname = $result['surname'];

接下来在操作中我改变布局并将变量传递给它:

$this->layout('layout/student'); $this->layout()->name = self::$name; $this->layout()->surname = self::$surname;

但我不希望从每个控制器的数据库中获取数据,并在每个操作中传递变量。

1 个答案:

答案 0 :(得分:0)

好的,我的解决方案就是这个。

在你的module.php里面

public function onBootstrap(MvcEvent $e)
{

    $sharedEvents = $e->getApplication()->getEventManager()->getSharedManager();
    $sharedEvents->attach(__NAMESPACE__, 'dispatch', function($e) {
    //This event will only be fired when an ActionController under the MyModule namespace is dispatched.
    $controller = $e->getTarget();

    //to be able to view actions and controllers
    $params = $e->getApplication()->getMvcEvent()->getRouteMatch()->getParams();
    $nameSurnameArray = $controller->getServiceLocator()->get('NAMEOFTABLEWITHSQL')->getNameSurname();
        if($params['action'] == 'test'){

        $controller->layout('layout/testlayout');
        $controller->layout()->name = $nameSurnameArray['name'];
        $controller->layout()->surname = $nameSurnameArray['surname']';
        }

    }, 100);

    $eventManager        = $e->getApplication()->getEventManager();
    $serviceManager      = $e->getApplication()->getServiceManager();
    $moduleRouteListener = new ModuleRouteListener();
    $moduleRouteListener->attach($eventManager);
    $this->bootstrapSession($e);
}

因此,如果路由是Action测试,则加载testLayout,并将我从数据库获取的名称和姓氏传递给该布局。同样,如果一个控制器具有相同的布局,则可以指定控制器($ params [&#39; controller&#39;] ==&#39; testModule \ Controller \ testController&#39;)而不是操作。

我猜这个解决方案可以改进,但希望它会指向正确的方向