2

既存のアプリケーションをZendFramework1からZendFramework2に変換しようとしていますが、少し問題があります。

元のアプリケーションでは、コントローラーに次のものがありました

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

あなたがする必要があるのは、すべてのビュー変数を配列に格納し、配列を返すことです。追加の機能が必要でない限り、ViewModelやJsonModelなどのクラスや戦略は必要ありません。

コントローラのアクション関数が配列を返す限り、それらの値をビューに渡すことができます。

そのようです:

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

そして実際にZF2に移行するには、Zend_Registryの代わりにServiceManagersとServiceLocatorsを使用します。まだ存在しない場合は、getServiceConfig()という関数を作成することにより、Module.phpファイルでサービスマネージャーを割り当てることができます。少しこのように見えるはずです。

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

これは、service_managerを使用してグローバルconfig/autoloadファイルのdatabase.local.phpファイルを介してdbアダプターを追加することも検討します。

そのようです:

<?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'],
         ));
     },

このすべての後、コントローラーでServiceLocatorを使用する単純な関数を使用して、Sessionクラスまたは使用するものを簡単に取得できます。

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 に答える
1

メインのlayout.phtmlをロードするアプリケーションモジュールがあります。次のコードを追加しましたが、うまくいきました(ZF2.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 } ?>
于 2014-04-02T15:33:35.080 に答える