2017-06-16 61 views
-1

我花了最近幾個小時試圖找到答案,但是根本沒有獲得答案。我覺得它最終會成爲我不瞭解的簡單東西。這部分代碼當然是不正確的,但我想展示我在這裏想要做的事情。我目前有一個基礎知識庫類,裏面有findAllQueryBuilder方法,可以減少代碼。現在我有大約10個存儲庫類,都需要使用findAllQueryBuilder。這個函數在我構建的基礎控制器中。主要問題是這個控制器沒有看到findAllQueryBuilder,因爲你可以看到這需要參數來確定需要哪個數據位置。我已經在我的代碼的另一個位置用接口完成了這個任務,但是這是一個類,我也將這個例子放在這裏。控制器類不能從存儲庫類中看到方法

public function listAction(Request $request, RepositoryTypeInterface $repositoryName, $table, $sql, $route) 
{ 
    $filter = $request->query->get('filter'); 
    $repository = "Bundle:$repositoryName"; 
    $qb = $this->getDoctrine() 
     ->getRepository($repository, 'tenant') 
     ->findAllQueryBuilder($filter, $table, $sql); 

正如你可以在我設定的類型爲接口,以確保它知道這將是該那麼下面看。

public function newAction(Request $request, EntityTypeInterface $controllerType, formType, $repository, $routeName) 
{ 

然後是childclass controllor

public function newAction(Request $request, EntityTypeInterface $controllerType = null, $formType = ContactType::class, $repository = 'Contact', $routeName = 'api_contacts_show') 
{ 
    $controllerType = new Contact(); 
    return parent::newAction($request, $controllerType, $formType, $repository, $routeName); 
} 

中實例化它,因此上面第一個例子我已經嘗試同樣的事情,但我不知道如何將其應用到這種情況。因爲「Bundle:$ repository」是一個字符串,所使用的參數是一個字符串,它不是一個實體,所以當我需要的是它的功能時,創建一個實例是沒有意義的。我只需要一些方法來訪問這個功能。任何想法都可以工作,但我覺得我錯過了一些簡單的東西。

以下是我得到的確切錯誤, 在\ Doctrine \ Common \ Persistence \ ObjectRepository中找不到方法'findAllQueryBuilder' 在主題類中未找到引用的方法。

我敢肯定,有一種方法可以將這個概念應用於解決「看不見」功能的問題,但現在我並不完全確定。 提前謝謝任何人。

編輯: 我使用的是basecontrollor被用於其它控制器設置此功能,即:它使用映射到contactrepository類ContactEntity類,這是一個baserepository類就是findAllQueryBuilder所在的子cantactscontrollor類,我不知道如何映射。

+1

看起來像教條認爲'\ Doctrine \ Common \ Persistence \ ObjectRepository'是您的類的存儲庫,您是否在類映射中將存儲庫設置爲您的自定義類? – ccKep

+0

檢查編輯文件結構的更多細節 –

+0

嗨!我不確定存在繼承是存儲庫類的問題,只要確保在您的ContactEntity註釋中包含@Entity(repositoryClass =「」)(假設您使用了註釋)。 – SebastianGreen

回答

0
public function listAction(Request $request, $repositoryName, $table, $sql, $route) 
{ 
    $filter = $request->query->get('filter'); 
    $repository = "TenantBundle:$repositoryName"; 

    /** @var RepositoryTypeInterface $qb */ 
    $qb = $this->getDoctrine() 
     ->getRepository($repository, 'tenant'); 

    $queryResults = $qb->findAllQueryBuilder($filter, $table, $sql); 

對不起,這個響應遲,但這裏是我的回答能找到。正如我以爲這是一個簡單的事情,但基本上是Docblock標記爲$ qb作爲上述的接口,確保它知道任何實現它的類將被接受。現在知道它會是什麼類型,錯誤信息不再存在。還要注意我如何分割它。

相關問題