控制器类没有从存储库类中看到方法

时间:2017-06-16 15:23:00

标签: symfony interface doctrine repository methodnotfound

我花了最后几个小时试图找到答案,但根本没有获得答案。我觉得它最终会成为我不知道的简单事物。这部分代码当然是不正确的,但我想展示我在这里尝试做什么的想法。我目前有一个基本存储库类,其中包含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)
{

然后在子类控制器

中实例化它
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来为其他控制器设置它,即:cantactscontrollor类,它使用映射到contactrepository类的ContactEntity类,它是findAllQueryBuilder所在的baserepository类的子代,我不知道如何映射它。

1 个答案:

答案 0 :(得分: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);

对于迟到的回复感到抱歉,但这是我能找到的答案。我认为这是一个简单的事情,但基本上标记为$ qb的Docblock作为上述接口,确保它知道任何实现它的类都将被接受。现在知道它将是什么类型,错误消息不再存在。另请注意我如何拆分它。