Symfony2 - Doctrine无法进行自定义存储库

时间:2015-02-13 12:40:30

标签: symfony doctrine-orm doctrine

我搜索过很多答案,但似乎没有一个能帮助我。基本上,当我尝试加载我的页面时,我收到错误

未定义的方法' findTotalMatches'。方法名称必须以findBy或findOneBy!

开头

显然Symfony2 / Doctrine没有找到我的自定义存储库类。我的包结构是这样的 尼克/ AlertBundle /然后我所有的其他目录。

在我的实体课程中,我有

<?php

namespace Nick\AlertBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints\DateTime;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * AvailabilityAlert
 *
 * @ORM\Table(name="availability_alert")
 * @ORM\Entity(repositoryClass="Nick\AlertBundle\Repository\AvailabilityAlertRepository")
 *
 */
class AvailabilityAlert
{

    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="search_command", type="string", length=256, nullable=false)
     */
    private $searchCommand;

    /**
     * @var string
     *
     * @ORM\Column(name="is_connecting", type="string", length=20, nullable=false)
     */
    private $isConnecting;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="last_updated", type="datetime", nullable=false)
     */
    private $lastUpdated;

    /**
     * @var boolean
     *
     * @ORM\Column(name="is_deleted", type="boolean", nullable=false)
     */
    private $isDeleted;

    /**
     * @var string
     *
     * @ORM\Column(name="alert_status", type="string", length=11, nullable=false)
     */
    private $alertStatus;

}

所以它指向我的Repository目录中的AvailabilityAlertRepository。使用该命令生成此类由于某种原因没有工作(没有错误,只是没有创建类)所以我不得不手动创建它。我为测试目的而做的只是

<?php

namespace Nick\AlertBundle\Repository;

use Doctrine\ORM\EntityRepository;

class AvailabilityAlertRepository extends EntityRepository
{
    public function findTotalMatches($keyword)
    {
        return 34;
    }
}

然后在我的控制器中,我有

$keyword = "TEST";
$userRepo = $this->getDoctrine()->getRepository('NickAlertBundle:AvailabilityAlert');
var_dump($userRepo->findTotalMatches($keyword));

所以我能看到的一切看起来都是正确的,但是我仍然得到了开头提到的错误。我注意到一些答案提到了确保我没有使用yml,而不是确定如何检查这个(我已经使用了注释用于我认为的其他一切)。

所以我错过了一些明显的东西吗?

位于Resources / config / doctrine / AvailabilityAlert.orm.xml

<?xml version="1.0" encoding="utf-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
  <entity name="Nick\AlertBundle\Entity\AvailabilityAlert" table="availability_alert">
    <id name="id" type="integer" column="id">
      <generator strategy="IDENTITY"/>
    </id>
    <field name="searchCommand" type="string" column="search_command" length="256" nullable="false"/>
    <field name="isConnecting" type="string" column="is_connecting" length="20" nullable="false"/>
    <field name="lastUpdated" type="datetime" column="last_updated" nullable="false"/>
    <field name="isDeleted" type="boolean" column="is_deleted" nullable="false"/>
    <field name="alertStatus" type="string" column="alert_status" length="11" nullable="false"/>
  </entity>
</doctrine-mapping>

由于

2 个答案:

答案 0 :(得分:1)

通常这是因为你的包没有被学说映射:

  • 运行命令php app/console doctrine:mapping:info以确保您的包已映射。
  • 如果未映射,只需将其添加到config.yml文件中:

     orm:
            default_entity_manager: default
            entity_managers:
                default:
                    connection: default
                    mappings:
                        NickAlertBundle:  ~
    

然后再次检查您的存储库。

我在您的代码中观察到的其他内容是: $userRepo = $this->getDoctrine()->getRepository('NickAlertBundle:AvailabilityAlert');

尝试更改它: $userRepo = $this->getDoctrine()->getManager()->getRepository('NickAlertBundle:AvailabilityAlert');

答案 1 :(得分:0)

我认为问题在于您对存储库的调用。您的捆绑包名为&#39; AlertBundle&#39;不是&#39; NickAlertBundle&#39;。

尝试像这样调用您的存储库:

$er = $this->getManager()->getRepository('AlertBundle:AvailabilityAlert');

我希望这有帮助!