【问题标题】:Passing values to view in Zend Framework 2在 Zend Framework 2 中传递值以查看
【发布时间】:2013-03-11 05:29:44
【问题描述】:

我正在尝试将我们现有的应用程序从 Zend Framework 1 转换为 Zend Framework 2,但遇到了一点麻烦。

在原始应用程序中,我的控制器中有以下内容

function init()
{
    $this->initialize_values();
}

我所有的控制器都扩展了一个基类,其中包含该功能,如此处所示。

protected function initialize_values()
{

    $this->_db = Zend_Registry::get('dbAdapter');
    $this->_current_user = new User(&$this->_db);

    $this->_auth = Zend_Auth::getInstance();
    if($this->_auth->hasIdentity())
    {
        $this->_current_user = unserialize($_SESSION['current_user']);
        $this->view->current_user = $this->_current_user;
    }
}

我已经复制了所有功能,除了我设置视图值的最后一行。

似乎在我为 ZF2 找到的所有示例中,它们都返回了一个数组或一个视图模型。我没有看到将值传递给未附加到操作函数的视图的方法。

【问题讨论】:

    标签: php controller zend-framework2


    【解决方案1】:

    这是因为由您来创建 new ViewModel() 并将其返回给调用脚本。根据您从控制器返回的内容,将调用适当的渲染器。

    例如,如果我要返回一个 html 块,我会使用

    return new ViewModel(array('results' => $results));
    

    在我的控制器操作结束时。但是,如果我想提供 JSON 输出,我会返回

    return new JsonModel($results);
    

    在您的情况下,您可以准备视图模型并将其存储在受保护的变量中,然后向其中添加变量,如下所示:

    // in your constructor
    $this->_view = new ViewModel();
    
    // in your initialize values method
    $this->_view->setVariable($name, $value);
    

    然后当准备输出时:

    // in your controller action
    return $this->_view;
    

    【讨论】:

      【解决方案2】:

      您需要做的就是将所有视图变量存储到一个数组中并返回该数组。 除非您需要额外的功能,否则您不需要任何类或策略,例如 ViewModel 或 JsonModel。

      因此,只要控制器中的 Action 函数返回数组,就可以将这些值传递给视图。

      像这样:

      public function indexAction()
      {
        $current_user = $this->getSession();
        return array(
            'current_user' => $current_user          
        );
      }
      

      要真正使用 ZF2,请使用 ServiceManagers 和 ServiceLocators 而不是 Zend_Registry。 您可以通过创建一个名为 getServiceConfig() 的函数在 Module.php 文件中分配服务管理器(如果它尚不存在)。它应该看起来有点像这样。

      public function getServiceConfig()
      {
        'factories' => array(
           'session' => function ($sm){
              return new Session($sm->get('Zend/Db/Adapter/Adapter'));
           }
         )
      }
      

      我也会考虑通过 database.local.php 文件添加您的数据库适配器 带有 service_manager 的全局配置/自动加载文件。

      像这样:

      <?php
      $Params = array(
      'database'  => 'YOUR DATABASE',
      'username'  => 'YOUR USERNAME',
      'password'  => 'YOUR PASSWORD',
      'hostname'  => 'YOUR HOSTNAME',
      );
      
      return array(
       'service_manager' => array(
       'factories' => array(
           'Zend\Db\Adapter\Adapter' => function ($sm) use ($Params) {
               return new Zend\Db\Adapter\Adapter(array(
                   'driver'    => 'pdo',
                   'dsn'       => 'mysql:dbname='.$Params['database'].';host='.$Params['hostname'],
                   'database'  => $Params['database'],
                   'username'  => $Params['username'],
                   'password'  => $Params['password'],
                   'hostname'  => $Params['hostname'],
               ));
           },
      

      在这一切之后,您可以简单地获取您的 Session 类或您将要使用的任何东西 带有一个简单的函数,它将使用 Controller 中的 ServiceLocator。

      protected $session;
      public function getSession()
      {
         if($this->session == null)
         {
            $sl = $this->getServiceLocator();
            $this->session = $sl->get('session');
         }
         return $this->session;
      }
      

      【讨论】:

      • 我喜欢你的回答,但我迷失在 layout.phtml 中我似乎找不到变量,即使不使用 $this->variable_name 我做错了什么?
      【解决方案3】:

      我有一个加载主 layout.phtml 的应用程序模块。我添加了以下代码,它对我有用(ZF 2.2.2)。

      onBootstrap(MvcEvent $e) 中的Application/Module.php:

      $auth = new AuthenticationService();
      $authenticated = false;
      if ($auth->hasIdentity()) {
          $authenticated = true;
      }
      $viewModel = $e->getViewModel();
      $viewModel->setVariable('authenticated', $authenticated);
      

      在 layout.phtml 中:

      <?php
      if ($this->authenticated === true) { ?>
          <li class="active"><a href="<?php echo $this->url('logout') ?>"><?php echo $this->translate('Logout') ?></a></li>
      <?php } else { ?>
          <li class="active"><a href="<?php echo $this->url('login') ?>"><?php echo $this->translate('Login') ?></a></li>
          <li class="active"><a href="<?php echo $this->url('register') ?>"><?php echo $this->translate('Sign Up') ?></a></li>
      <?php } ?>
      

      【讨论】:

      • $authenticated = false;应该做变量声明,避免认证未完成时的错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多