2014-01-07 84 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()沒有返回一個對象,因爲該函數不知道服務管理器是什麼。

你需要的是把你需要的所有邏輯放在渲染該視圖之前分派的實際控制器中,並將值傳遞給視圖,或者如果它的絕對視圖相關,你可以創建一個視圖幫助器來自evan coury(其中一位ZF2大師)的教程Sam(其他ZF2大師)在其回答中建議