2015-04-01 22 views
1

我有一個錯誤,我找不到解決方案。我有一個司機的Symfony這樣的:在Symfony控制器中的教條問題

<?php 

namespace Consolidador\PanelBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 

class DataController extends Controller 
{ 

    public function listOfUsers() 
    { 
     $em = $this->getDoctrine()->getManager(); 
     $settings = $em->getRepository('PanelBundle:Users')->findAll(); 

     return $settings; 

    } 

} 

由於只看到返回使用Doctrine用戶的列表,以及當我打電話的任何方法,如:

$users = new DataController(); 
    $listOfUsers = $users->listOfUsers() 

例外出現在DataController類類具有與學說做:

Error: Call to a member function has() on a non-object

我不明白髮生了什麼,我使用和擴展控制器,所以你應該能夠訪問主義沒有任何錯誤......在其他C ontrollers使用主義沒有重大問題。

任何解決方案?

非常感謝。

+0

你如何傳遞一個doctrine引用到你的類datacontroller?你可以發佈datacontroller類的代碼嗎? – Matteo 2015-04-01 10:53:26

+0

代碼DataController類已啓動。我不以任何方式引用Doctrine,是不是你認爲如果擴展一個Controller類的類可以直接訪問容器依賴關係,那麼Doc​​trine? – JSGarcia 2015-04-01 11:00:16

回答

3

這是因爲您創建類的實例的方式。一個常規的symfony控制器實例由service container創建,它調用setContainer方法。您的DataController班級對容器不瞭解,這就是爲什麼您會收到錯誤(您不能僅僅執行new DataController())。

一個快速的方式來解決,這是剛剛成立容器上的DataController實例:

$users = new DataController(); 
$users->setContainer($container); //you need to have container available, I don't know what context are you in 
$listOfUsers = $users->listOfUsers(); 

了適當的方式做,這是define your Controller as a service,注入Doctrine到它,並通過

得到它
$dataController = $this->container->get('your_data_controller_class'); 

重要注意事項:其他的事情是,控制器意味着要採取Request和r eturn Response對象,在你的情況下,你正在返回一個不好的數組。您應該將此邏輯移到Controller類之外的某個位置 - 類似UserManager類。那麼你應該將這個UserManager定義爲服務,注入Doctrine,在那裏做你的邏輯並返回數據(一個數組)。在你的控制器中,你應該調用這個服務。

這樣你將得到更乾淨的代碼並將控制器外部的邏輯移動。

+0

謝謝,我試着直接在課堂上設置容器,它工作。我會閱讀你通過我的鏈接,儘可能正確地做到這一點。謝謝! – JSGarcia 2015-04-01 11:13:32