php Doctrine2 - “class” 不是有效的实体或映射的超类

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/15099060/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 08:34:24  来源:igfitidea点击:

Doctrine2 - "class" is not a valid entity or mapped super class

phpdoctrine-orm

提问by KennyPowers

I get exception Uncaught exception 'Doctrine\ORM\Mapping\MappingException' with message 'Class "Users" is not a valid entity or mapped super classevery time when I run the next code:

Uncaught exception 'Doctrine\ORM\Mapping\MappingException' with message 'Class "Users" is not a valid entity or mapped super class每次运行下一个代码时,我都会遇到异常:

test.php

测试文件

<?php
require_once "vendor/autoload.php";

use Doctrine\ORM\Tools\Setup;
use Doctrine\ORM\EntityManager;

$paths = array(dirname(__FILE__)."/entities");
$isDevMode = false;

// the connection configuration
$dbParams = array(
    'driver'   => 'pdo_mysql',
    'user'     => 'root',
    'password' => 'pass',
    'dbname'   => 'snabcentr',
);

$config = Setup::createAnnotationMetadataConfiguration($paths, $isDevMode);
$em = EntityManager::create($dbParams, $config);

$user = $em->find("Users", 5);

entities/Users.php

实体/用户.php

<?php
use Doctrine\ORM\Mapping as ORM;

/**
 * Users
 *
 * @ORM\Table(name="users")
 * @ORM\Entity
 */
class Users
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="email", type="string", length=255, nullable=true)
     */
    private $email;

    /**
     * @var string
     *
     * @ORM\Column(name="password", type="string", length=255, nullable=true)
     */
    private $password;

    /**
     * @var string
     *
     * @ORM\Column(name="type", type="string", nullable=true)
     */
    private $type;

    /**
     * @var string
     *
     * @ORM\Column(name="client_inn", type="string", length=255, nullable=true)
     */
    private $clientInn;

    /**
     * @var string
     *
     * @ORM\Column(name="client_ogrn", type="string", length=255, nullable=true)
     */
    private $clientOgrn;

    /**
     * @var string
     *
     * @ORM\Column(name="client_rs", type="string", length=255, nullable=true)
     */
    private $clientRs;

    /**
     * @var string
     *
     * @ORM\Column(name="client_ks", type="string", length=255, nullable=true)
     */
    private $clientKs;

    /**
     * @var string
     *
     * @ORM\Column(name="client_bik", type="string", length=255, nullable=true)
     */
    private $clientBik;

    /**
     * @var string
     *
     * @ORM\Column(name="client_uaddress", type="string", length=255, nullable=true)
     */
    private $clientUaddress;

    /**
     * @var string
     *
     * @ORM\Column(name="client_faddress", type="string", length=255, nullable=true)
     */
    private $clientFaddress;

    /**
     * @var string
     *
     * @ORM\Column(name="client_daddress", type="string", length=255, nullable=true)
     */
    private $clientDaddress;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255, nullable=true)
     */
    private $name;

    /**
     * @var string
     *
     * @ORM\Column(name="notes", type="text", nullable=true)
     */
    private $notes;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="added_date", type="datetime", nullable=true)
     */
    private $addedDate;


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set email
     *
     * @param string $email
     * @return Users
     */
    public function setEmail($email)
    {
        $this->email = $email;

        return $this;
    }

    /**
     * Get email
     *
     * @return string 
     */
    public function getEmail()
    {
        return $this->email;
    }

    /**
     * Set password
     *
     * @param string $password
     * @return SnabUsers
     */
    public function setPassword($password)
    {
        $this->password = $password;

        return $this;
    }

    /**
     * Get password
     *
     * @return string 
     */
    public function getPassword()
    {
        return $this->password;
    }

    /**
     * Set type
     *
     * @param string $type
     * @return SnabUsers
     */
    public function setType($type)
    {
        $this->type = $type;

        return $this;
    }

    /**
     * Get type
     *
     * @return string 
     */
    public function getType()
    {
        return $this->type;
    }

    /**
     * Set clientInn
     *
     * @param string $clientInn
     * @return SnabUsers
     */
    public function setClientInn($clientInn)
    {
        $this->clientInn = $clientInn;

        return $this;
    }

    /**
     * Get clientInn
     *
     * @return string 
     */
    public function getClientInn()
    {
        return $this->clientInn;
    }

    /**
     * Set clientOgrn
     *
     * @param string $clientOgrn
     * @return SnabUsers
     */
    public function setClientOgrn($clientOgrn)
    {
        $this->clientOgrn = $clientOgrn;

        return $this;
    }

    /**
     * Get clientOgrn
     *
     * @return string 
     */
    public function getClientOgrn()
    {
        return $this->clientOgrn;
    }

    /**
     * Set clientRs
     *
     * @param string $clientRs
     * @return SnabUsers
     */
    public function setClientRs($clientRs)
    {
        $this->clientRs = $clientRs;

        return $this;
    }

    /**
     * Get clientRs
     *
     * @return string 
     */
    public function getClientRs()
    {
        return $this->clientRs;
    }

    /**
     * Set clientKs
     *
     * @param string $clientKs
     * @return SnabUsers
     */
    public function setClientKs($clientKs)
    {
        $this->clientKs = $clientKs;

        return $this;
    }

    /**
     * Get clientKs
     *
     * @return string 
     */
    public function getClientKs()
    {
        return $this->clientKs;
    }

    /**
     * Set clientBik
     *
     * @param string $clientBik
     * @return SnabUsers
     */
    public function setClientBik($clientBik)
    {
        $this->clientBik = $clientBik;

        return $this;
    }

    /**
     * Get clientBik
     *
     * @return string 
     */
    public function getClientBik()
    {
        return $this->clientBik;
    }

    /**
     * Set clientUaddress
     *
     * @param string $clientUaddress
     * @return SnabUsers
     */
    public function setClientUaddress($clientUaddress)
    {
        $this->clientUaddress = $clientUaddress;

        return $this;
    }

    /**
     * Get clientUaddress
     *
     * @return string 
     */
    public function getClientUaddress()
    {
        return $this->clientUaddress;
    }

    /**
     * Set clientFaddress
     *
     * @param string $clientFaddress
     * @return SnabUsers
     */
    public function setClientFaddress($clientFaddress)
    {
        $this->clientFaddress = $clientFaddress;

        return $this;
    }

    /**
     * Get clientFaddress
     *
     * @return string 
     */
    public function getClientFaddress()
    {
        return $this->clientFaddress;
    }

    /**
     * Set clientDaddress
     *
     * @param string $clientDaddress
     * @return SnabUsers
     */
    public function setClientDaddress($clientDaddress)
    {
        $this->clientDaddress = $clientDaddress;

        return $this;
    }

    /**
     * Get clientDaddress
     *
     * @return string 
     */
    public function getClientDaddress()
    {
        return $this->clientDaddress;
    }

    /**
     * Set name
     *
     * @param string $name
     * @return SnabUsers
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set notes
     *
     * @param string $notes
     * @return SnabUsers
     */
    public function setNotes($notes)
    {
        $this->notes = $notes;

        return $this;
    }

    /**
     * Get notes
     *
     * @return string 
     */
    public function getNotes()
    {
        return $this->notes;
    }

    /**
     * Set addedDate
     *
     * @param \DateTime $addedDate
     * @return SnabUsers
     */
    public function setAddedDate($addedDate)
    {
        $this->addedDate = $addedDate;

        return $this;
    }

    /**
     * Get addedDate
     *
     * @return \DateTime 
     */
    public function getAddedDate()
    {
        return $this->addedDate;
    }
}

Do you have any ideas why? eAccelerator is not set up. Doctrine v 2.2, PHP v 5.3.22, zend engine 2.3.0

你有什么想法吗?未设置 eAccelerator。Doctrine v 2.2、PHP v 5.3.22、zend 引擎 2.3.0

回答by Ocramius

You are using a Doctrine\Common\Annotations\SimpleAnnotationReaderinstead of a Doctrine\Common\Annotations\AnnotationReader.

您正在使用 aDoctrine\Common\Annotations\SimpleAnnotationReader而不是 a Doctrine\Common\Annotations\AnnotationReader

The SimpleAnnotationReaderworks with default namespaces and reads annotations in format @Entity, while the AnnotationReadercan use the imported classes and namespaces (via usestatement) and annotations such as @ORM\Entity.

SimpleAnnotationReader默认命名空间工程和格式读取的注释@Entity,而AnnotationReader可以使用进口类和命名空间(通过use声明)和注释等@ORM\Entity

You can read more about that on the documentation.

您可以在文档中阅读更多相关信息。

Here's a fixed version of your test.php

这是你的固定版本 test.php

<?php

use Doctrine\ORM\Tools\Setup;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Mapping\Driver\AnnotationDriver;
use Doctrine\Common\Annotations\AnnotationReader;
use Doctrine\Common\Annotations\AnnotationRegistry;

require_once __DIR__ . '/vendor/autoload.php';
require_once __DIR__ . '/entities/Users.php';

$paths            = array(__DIR__ . '/entities');
$isDevMode        = false;
$connectionParams = array(
    'driver'   => 'pdo_mysql',
    'user'     => 'root',
    'password' => 'pass',
    'dbname'   => 'dbname',
);

$config = Setup::createConfiguration($isDevMode);
$driver = new AnnotationDriver(new AnnotationReader(), $paths);

// registering noop annotation autoloader - allow all annotations by default
AnnotationRegistry::registerLoader('class_exists');
$config->setMetadataDriverImpl($driver);

$em = EntityManager::create($connectionParams, $config);

$user = $em->find('Users', 5);

回答by ziiweb

In my case, I just forgot to add @ORM\Entity, like this:

就我而言,我只是忘了添加@ORM\Entity,如下所示:

/**
 * Project\BackendBundle\Entity\Pedido
 *
 * @ORM\Table
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 */
class Pedido

回答by Oleg Abrazhaev

You can use your configuration, just provide FALSE to use simple annotation reader, like that.

您可以使用您的配置,只需提供 FALSE 即可使用简单的注释阅读器,就像这样。

<?php

//same code

$isSimpleMode = FALSE;
$proxyDir = null;
$cache = null;
$config = Setup::createAnnotationMetadataConfiguration(
$paths, $isDevMode, $proxyDir, $cache, $isSimpleMode
);

//same
?>

回答by manix

In my case, I received this error because I opened the doc block with /***instead of /**:

就我而言,我收到此错误是因为我打开了文档块/***而不是/**

/***
 * @entity
 * @table(name="bans")
 */

回答by rattybag

Following to Ocramius's answer (which saved me as well)

按照奥克拉米乌斯的回答(这也救了我)

If you've got some custom namespacing on your Entities make sure that the annotations come after the namespace decleration, here is my Entity that worked:

如果您的实体上有一些自定义命名空间,请确保注释在命名空间声明之后出现,这是我的实体有效:

<?php


namespace App\Models;

/**
  * Books
  *
  * @ORM\Table(name="books")
  * @ORM\Entity
  */

  use Doctrine\ORM\Mapping as ORM;


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

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

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

Then in my controller:

然后在我的控制器中:

   $entityManager->find('App\Models\Books', 1)

Success!

成功!