2

我正在尝试将我们现有的应用程序从 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 找到的所有示例中,它们似乎都返回了一个数组或一个视图模型。我没有看到将值传递给未附加到操作函数的视图的方法。

4

3 回答 3

9

那是因为由您来创建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;
于 2013-03-11T06:01:16.597 回答
1

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

onBootstrap(MvcEvent $e) 中的应用程序/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 } ?>
于 2014-04-02T15:33:35.080 回答
1

您需要做的就是将所有视图变量存储到一个数组中并返回该数组。除非您需要其他功能,否则您不需要任何类或策略,例如 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'));
     }
   )
}

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

像这样:

<?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;
}
于 2013-03-11T08:32:46.280 回答