2014-09-03 7 views
0

개체에서 __invoke()를 호출 할 때 문제가 있습니다. __invoke() 메서드는 인스턴스 변수에 독립적입니다? ZF2 주입으로 $ this-> getView() -> render (...) (그렇지 않으면 getView()가 null을 반환 함)를 호출하기 때문에 템플릿에 직접 __invoke()를 호출해야하고 인스턴스 변수를 설정하고 싶습니다. 그곳에. 해결 방법은 없습니까?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 

    } 
} 

내가 __invoke를 호출하기 전에 몇 가지 옵션 또는 setOptions을 방법으로 생성자를 호출해야합니까() :

내 코드를 참조하십시오.

감사합니다.

답변

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을 사용하는 것 같다. 혼자서 인스턴스를 만들 필요는 없습니다. 보기에서 ViewHelper를 사용하기 만하면됩니다. 그렇다면 $options__invoke 메서드의 매개 변수로 지정하는 것이 가장 좋은 이유는 무엇입니까?

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

을 그리고보기에서 ViewHelper 전화 : 컨트롤러에서

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

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

은보기로 옵션 배열을 전달

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

가 기억이 방법으로 필요하지 않은 ViewHelper를 초기화하는 팩토리 invokables에 추가하십시오.

module.config.php 예 : 어쩌면

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

내가 개념적으로 잘못을하고 있어요, 내가 할 노력하고있어가, 컨트롤러의 새로운 PersonShowWidget을 만들 setOptions을 방법으로 구성하는 것입니다 및 뷰에 표시 (반향)하십시오. 어쩌면 getView() 메소드가 null을 반환합니다. 왜냐하면 뷰 안의 ViewManager를 통과하지 못하기 때문입니다. – vicaba

+0

@vicaba 내 편집을 참조하십시오 .. – bitWorking

+0

제가 지금 말씀 드리는 방식대로하고 있는데 문제는 컨트롤러에서 viewhelper를 생성하면 setView()가 호출되지 않는다는 것입니다. 이제 컨트롤러에서 렌더링하려고합니다. 모달로 변환하고 단추를 눌렀을 때만 코드를 보내려고합니다. – vicaba