2014-01-07 2 views
0

내 페이지에 사이드 바가 있는데 관리자 권한이있는 경우에만 관리자 링크를 표시하고 싶습니다. 내가보기에 그를 사용하면 컨트롤러에서 내 방법이 잘 작동하지만 난 오류가 : 나는이 작동하지 않는 것을 이해하지 못하는ZF2 함수 호출 방법

PHP Fatal error: Call to a member function get() on a non-object in /UNXDEVCKT01/www/firewall/ZendFramework/module/Firewall/src/Firewall/Service/UserRight.php on line 59 

을 ...

내 클래스 UserRight 클래스 :

<?php 

    namespace Firewall\Service; 

    use Zend\Mvc\Controller\ActionController; 
    use Zend\Session\Container; 
    use Zend\Mvc\Controller\AbstractActionController; 
    use Zend\View\Model\ViewModel; 
    use Zend\Db\TableGateway\Feature\RowGatewayFeature; 
    use Zend\Db\TableGateway\TableGateway; 
    use Zend\Mvc\Controller\Plugin\FlashMessenger; 
    use Zend\Http\Request; 

    class UserRight extends AbstractActionController 
    { 
     # Boolean 
     public function hasAdminRight() 
     { 
      # Call the User service table 
      $Rights = $this->getServiceLocator()->get('Firewall\Model\UserTable')->fetchAllList($this->session->user_id); 

      echo $Rights->right_admin. ' '. $Rights->user_group_admin; 


      # Check is the user have the admin rights, else he's redirected 
      return (($Rights->right_admin == 'n' && $Rights->user_group_admin == 'n')) ? false : true; 
     } 

     // Code ... 

    } 

?> 

내보기 :

<h3>Template</h3> 
    <ul class="toggle"> 
     <li class="icn_folder"><a href="#">File manager</a></li> 
     <li class="icn_photo"><a href="#">Gallery</a></li> 
     <li class="icn_audio"><a href="#">Audio</a></li> 
     <li class="icn_video"><a href="#">Video</a></li> 
    </ul> 
    <br/> 
    <?php 
     $UserRight = new \Firewall\Service\UserRight; 
     if($UserRight->hasAdminRight()): 
    ?> 
    <hr/><h3>Administration</h3> 
    <ul class="toggle"> 
     <li class="icn_add_user"><a href="<?php echo $this->url('user', array('action'=>'add'));?>">New user</a></li> 
     <li class="icn_categories"><a href="<?php echo $this->url('user', array('action'=>'list'));?>">User list</a></li> 
     <br/> 
     <li class="icn_profile"><a href="<?php echo $this->url('profile', array('action'=>'add'));?>">New profile</a></li> 
     <li class="icn_categories"><a href="<?php echo $this->url('profile', array('action'=>'list'));?>">Profile list</a></li> 
     <br/> 
     <li class="icn_view_users"><a href="<?php echo $this->url('group', array('action'=>'add'));?>">New group</a></li> 
     <li class="icn_categories"><a href="<?php echo $this->url('group', array('action'=>'list'));?>">Group list</a></li> 
     <!--<br/> 
     <li class="icn_settings"><a href="#">Options</a></li> 
     <li class="icn_security"><a href="#">Security</a></li> 
     <li class="icn_jump_back"><a href="#">Logout</a></li>--> 
    </ul> 
    <?php endif; ?> 

답변

1

문제의 근원을 이해 그래서 내가 뭔가를 설명하자 : 당신이 AbstractActionController을 연장하는 컨트롤러를 만들 경우, 상위 클래스의 모든 기능을 클래스있을 것이라는 점을

그것은 사실, 그리고 당신은 당신이 그들을 사용할 수 있다고 생각할 수 있습니다. 물론 정의 된 이후로 할 수 있습니다. 하지만 그 함수의 반환 값은 뭔가 마술에 기반하지 않습니다. 예를 들어 $ this-> getServiceLocator()가 서비스 로케이터를 반환하면 컨트롤러가 서비스 로케이터를 찾을 수있는 마법 능력을 가지고 있지 않기 때문입니다. 누군가 그것을 전에 주사 했어. 그럼 뭐가 문제 야? 당신의 문제는 당신이 손으로 UserRight을 만들고 있다는 것이며, 시스템이 컨트롤러를 생성 할 때 가진 모든 어려움을 겪을 것으로 기대하고 있습니다. 그러나 시스템은 단지 $UserRight = new \Firewall\Service\UserRight과 같은 것을 만들지 않지만보다 복잡한 절차를 통해 의존성을 주입합니다. 컨트롤러를 손으로 만들 수는 없으며 실제 컨트롤러가 아니기 때문에 시스템에서 컨트롤러를 만들 때와 동일한 동작을 할 것으로 기대됩니다. 그리고 더 이상 : 당신이 손으로 컨트롤러를 만들어서는 안됩니다.

$this->getServiceLocator()은 서비스 관리자의 역할을 알 수 없기 때문에 $this->getServiceLocator()이 개체를 반환하지 않습니다.

필요한 것은 해당 뷰를 렌더링하기 전에 디스패치 된 실제 컨트롤러에 필요한 모든 로직을 배치하고 뷰에 값을 전달하거나 뷰가 절대적으로 관련되어 있으면 다음과 같은 뷰 도우미를 만들 수 있습니다. 샘 (다른 ZF2 전문가)이 답변에서 권장하는 evan coury (ZF2 전문가 중 한 명)의 자습서