Zend framework Zend框架头数据

Zend framework Zend框架头数据,zend-framework,header,Zend Framework,Header,在views\scripts我有header.phtml文件中,有关于用户的信息:姓名、姓氏、照片 现在我必须在每个控制器构造函数中从数据库中获取这些数据,也许使用抽象类或其他更好的解决方案是什么 因为很难在每个控制器构造函数中放置相同的代码。定义一个BaseController,将每个控制器需要做的事情放在其中,并通过常规控制器进行扩展…定义一个BaseController,将每个控制器需要做的事情放在那里,并通过常规控制器进行扩展…是的,有两个建议的解决方案,第一个是制作一个插件(),该插件

views\scripts
我有
header.phtml
文件中,有关于用户的信息:姓名、姓氏、照片

现在我必须在每个控制器构造函数中从数据库中获取这些数据,也许使用抽象类或其他更好的解决方案是什么


因为很难在每个控制器构造函数中放置相同的代码。

定义一个BaseController,将每个控制器需要做的事情放在其中,并通过常规控制器进行扩展…

定义一个BaseController,将每个控制器需要做的事情放在那里,并通过常规控制器进行扩展…

是的,有两个建议的解决方案,第一个是制作一个插件(),该插件可以在引导程序中加载,并为每个请求做些事情,如果您想做的仅适用于少数动作,则可以创建一个动作助手()

在您的情况下,我会创建一个frontController插件,例如在dispatchLoopStartup上,它将用户数据存储在注册表中,然后在您的视图中从注册表中检索该数据并回显它。为了减少db请求的数量,插件可以使用用户会话来存储信息,因此只有对站点的第一个请求才会触发db查询,或者在登录时将用户数据放入会话中

我不建议使用baseController,因为这不是最佳实践,您必须编辑所有控制器以告诉他们扩展baseController,出于同样的原因,我也不会使用所有控制器的init函数,通过使用这个插件,您所需要做的就是在boostrap中初始化它,然后在header视图中从注册表中检索数据

插件的名称以库目录的名称开始,然后是您可能拥有的任何子文件夹,最后一个下划线是类的名称,这就是为什么自动加载程序根据您的操作系统将下划线替换为斜线或反斜线来查找插件的原因,以获得正确的路径

header.phtml:

<?php 
// test if userData is there
Zend_Debug::dump($userData);
HeaderUserDataPlugin.php:

<?php

/**
 * header user data plugin
 *
 **/
class MyLibrary_Controller_Plugin_HeaderUserDataPlugin extends Zend_Controller_Plugin_Abstract {

    public function routeShutdown(Zend_Controller_Request_Abstract $request) {

        // at this point you can retrieve the user id from session
        $mysession = new Zend_Session_Namespace('mysession');

        // is there a userId in the session
        if (!isset($mysession->userId)) {

            $userId = $mysession->userId;

            // get userData from user model
            $userModel = new UserModel();
            $userData = UserModel->getUserData($mysession->userId);

            Zend_Registry::set('user_data', $userData);

        }

    }

}

是的,有两种推荐的解决方案,第一种是制作一个插件(),例如在引导中加载,并为每个请求做一些事情,如果您想做的只适用于少数操作,您可以创建一个操作助手()

在您的情况下,我会创建一个frontController插件,例如在dispatchLoopStartup上,它将用户数据存储在注册表中,然后在您的视图中从注册表中检索该数据并回显它。为了减少db请求的数量,插件可以使用用户会话来存储信息,因此只有对站点的第一个请求才会触发db查询,或者在登录时将用户数据放入会话中

我不建议使用baseController,因为这不是最佳实践,您必须编辑所有控制器以告诉他们扩展baseController,出于同样的原因,我也不会使用所有控制器的init函数,通过使用这个插件,您所需要做的就是在boostrap中初始化它,然后在header视图中从注册表中检索数据

插件的名称以库目录的名称开始,然后是您可能拥有的任何子文件夹,最后一个下划线是类的名称,这就是为什么自动加载程序根据您的操作系统将下划线替换为斜线或反斜线来查找插件的原因,以获得正确的路径

header.phtml:

<?php 
// test if userData is there
Zend_Debug::dump($userData);
HeaderUserDataPlugin.php:

<?php

/**
 * header user data plugin
 *
 **/
class MyLibrary_Controller_Plugin_HeaderUserDataPlugin extends Zend_Controller_Plugin_Abstract {

    public function routeShutdown(Zend_Controller_Request_Abstract $request) {

        // at this point you can retrieve the user id from session
        $mysession = new Zend_Session_Namespace('mysession');

        // is there a userId in the session
        if (!isset($mysession->userId)) {

            $userId = $mysession->userId;

            // get userData from user model
            $userModel = new UserModel();
            $userData = UserModel->getUserData($mysession->userId);

            Zend_Registry::set('user_data', $userData);

        }

    }

}

如果我正确理解了这个问题,您希望在每个控制器构造中使用相同的查询调用DB,分配带有返回结果的视图变量,并在header.phtml中打印它们。如果这是你想要的,请阅读

如果内存不是问题,那么更简单的方法是将json编码的数组和所需数据存储在带有in-bootstrap的注册表中。这样,您只需要对DB进行一次查询

Bootstrap.php

$row = $db->fetchRow("SELECT name, surname, url FROM people WHERE id = '127'");
$userData = array('name' => $row ['name'], 'surname' => $row ['surname'], 'photo' => $row ['url']);
Zend_Registry::set('user_data', json_encode($userData));
class Zend_View_Helper_User
{
    public function user($property)
    {
        $userData = Zend_Registry::get('user_data');
        $userData = json_decode($userData, true);
        return $userData[$property];
    }
}
现在,您不需要将此代码放入任何控制器中。只需创建一个视图帮助器,它读取Zend_注册表中的内容,并返回所需的属性。您可以直接从
标题.phtml
调用它

/views/helpers/User.php

$row = $db->fetchRow("SELECT name, surname, url FROM people WHERE id = '127'");
$userData = array('name' => $row ['name'], 'surname' => $row ['surname'], 'photo' => $row ['url']);
Zend_Registry::set('user_data', json_encode($userData));
class Zend_View_Helper_User
{
    public function user($property)
    {
        $userData = Zend_Registry::get('user_data');
        $userData = json_decode($userData, true);
        return $userData[$property];
    }
}
标题。phtml

<p><?=$this->user('name')?> <?=$this->user('surname')?></p>
<img src="<?=$this->user('photo')?>"/>

用户('photo')?>“/>
如果我正确理解了这个问题,您需要在每个控制器构造中使用相同的查询调用DB,分配带有返回结果的视图变量,并将它们打印在header.phtml中。如果这是您想要的,请阅读

如果内存不是问题,那么更简单的方法是使用in-bootstrap在注册表中存储一个包含所需数据的json编码数组

Bootstrap.php

$row = $db->fetchRow("SELECT name, surname, url FROM people WHERE id = '127'");
$userData = array('name' => $row ['name'], 'surname' => $row ['surname'], 'photo' => $row ['url']);
Zend_Registry::set('user_data', json_encode($userData));
class Zend_View_Helper_User
{
    public function user($property)
    {
        $userData = Zend_Registry::get('user_data');
        $userData = json_decode($userData, true);
        return $userData[$property];
    }
}
现在,您不需要将此代码放在任何控制器中。只需制作一个视图帮助器,它从
Zend_注册表
读取并返回所需的属性。您可以直接从
头.phtml
调用它

/views/helpers/User.php

$row = $db->fetchRow("SELECT name, surname, url FROM people WHERE id = '127'");
$userData = array('name' => $row ['name'], 'surname' => $row ['surname'], 'photo' => $row ['url']);
Zend_Registry::set('user_data', json_encode($userData));
class Zend_View_Helper_User
{
    public function user($property)
    {
        $userData = Zend_Registry::get('user_data');
        $userData = json_decode($userData, true);
        return $userData[$property];
    }
}
标题。phtml

<p><?=$this->user('name')?> <?=$this->user('surname')?></p>
<img src="<?=$this->user('photo')?>"/>

用户('photo')?>“/>
但这是Bootstrap.php中的一个问题。我没有
用户id
,我从
会话数据中获取
用户id
,我的答案中已经包含了您需要的所有内容;)。。。不要将sql逻辑放入插件,将代码放入模型并在插件内部调用模型,视图助手是一个好主意
“plugin”
你的意思是
Bootstrap.php
?但是Bootstrap.php中有一个问题我没有
用户id
,我从
会话数据中获取
用户id
我的答案中已经包含了您需要的所有内容;)。。。不要将sql逻辑放入插件,将代码放入模型并在插件内部调用模型,视图助手是一个好主意
“plugin”
你的意思是
Bootstrap.php
?我得到错误
类头UserDataPlugin
不是foun