2014-09-03 39 views
0

我在調用對象__invoke()時遇到問題。 __invoke()方法是否與實例變量無關?我需要直接在我的模板上調用__invoke(),因爲一些ZF2注入調用$ this-> getView() - > render(...)(否則getView()返回null),我想要設置實例變量那裏。任何解決方法?PHP神奇方法__invoke,空實例變量

見我的代碼:

namespace Person\Person\View\Helper; 


use Zend\View\Helper\AbstractHelper; 

class PersonShowWidget extends AbstractHelper 
{ 

    protected $model = null; 

    public function __construct(array $options = null) 
    { 
     $this->parseOptions($options); 
    } 

    public function __invoke() 
    { 

     var_dump($this->model); //returns null 
     return $this->getView()->render('person/show/show_widget', array(
       'title' => 'Cliente', 
       'model' => $this->model, 
      ) 
     ); 
    } 

    public function setOptions(array $options = null) 
    { 
     $this->parseOptions($options); 
    } 

    protected function parseOptions(array $options = null) 
    { 
     if (!is_null($options) && is_array($options)) { 
      if (isset($options['model'])) { 
       $model = $options['model']; 
       if (isset($model['id'])) { 
        $this->model['id'] = $model['id']; 
       } else { 
        throw new \Exception; 
       } 
       if (isset($model['form'])) { 
        $this->model['form'] = $model['form']; 
       } else { 
        throw new \Exception; 
       } 
      } 
     } 

     var_dump($this->model); //returns valid data 

    } 
} 

我呼籲一些選項或setOptions方法構造函數調用之前__invoke()。

謝謝,

回答

1

你必須用工廠初始化視圖助手。通過這種方式,可以確保在調用__invoke方法之前調用構造函數。而且,__invoke()方法對於實例變量不是不可知的。

在Module.php

public function getViewHelperConfig() 
{ 
    return array(
     'factories' => array(
      'personShowWidget' => function ($helpers) { 
       $array = array(); 
       $helper = new Person\Person\View\Helper\PersonShowWidget($array); 
       return $helper; 
      }, 
     ) 
    ); 
} 

還是在module.config.php

'view_helpers' => array 
(
    'factories' => array(
     'personShowWidget' => function ($helpers) { 
      $array = array(); 
      $helper = new Person\Person\View\Helper\PersonShowWidget($array); 
      return $helper; 
     }, 
    ) 
) 

性能明智的你最好做一個工廠類,而不是一個可調用的。 更多信息:http://framework.zend.com/manual/2.0/en/modules/zend.module-manager.module-manager.html

編輯:

看來你錯誤地使用視圖助手等。你不必自己創建實例。只需在視圖中使用ViewHelper即可。那麼,爲什麼不把$options作爲__invoke方法的參數呢?

public function __invoke(array $options = null) 
{ 
    $this->setOptions($options); 

    return $this->getView()->render('person/show/show_widget', array(
      'title' => 'Cliente', 
      'model' => $this->model, 
     ) 
    ); 
} 

在控制器選項數組傳遞給視圖:

return array(
    'options' => $options, 
); 

,並調用視圖助手視圖:

<?php echo $this->personShowWidget($this->options); ?> 

記住:這樣就不需要一個工廠來啓動ViewHelper。只需將其添加到可調用的。

module.config.php例如:

'view_helpers' => array(
    'invokables' => array(
     'personShowWidget' => 'Person\Person\View\Helper\PersonShowWidget', 
    ), 
), 
+0

也許我做的概念錯了,我想要做的就是創建一個控制器中的新PersonShowWidget,通過setOptions方法進行配置和然後在視圖中顯示(回顯)它。也許getView()方法返回null,因爲我沒有通過視圖中的ViewManager獲取它? – vicaba 2014-09-04 07:48:37

+0

@vicaba看到我的編輯.. – bitWorking 2014-09-04 13:34:17

+0

我這樣做,你現在提到的方式,問題是,如果我在控制器中創建viewhelper,setView()從來沒有被調用過。現在我試圖在控制器中呈現它,因爲我想將其轉換爲模式,並且只有在按下按鈕時纔想發送代碼。 – vicaba 2014-09-05 13:51:44