Doctrine2 - “class” is not a valid entity or mappe

2019-01-17 06:20发布

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

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
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

5条回答
爷、活的狠高调
2楼-- · 2019-01-17 06:47

You are using a Doctrine\Common\Annotations\SimpleAnnotationReader instead of a Doctrine\Common\Annotations\AnnotationReader.

The SimpleAnnotationReader works with default namespaces and reads annotations in format @Entity, while the AnnotationReader can use the imported classes and namespaces (via use statement) and annotations such as @ORM\Entity.

You can read more about that on the documentation.

Here's a fixed version of your 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);
查看更多
别忘想泡老子
3楼-- · 2019-01-17 06:55

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

/**
 * Project\BackendBundle\Entity\Pedido
 *
 * @ORM\Table
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 */
class Pedido
查看更多
仙女界的扛把子
4楼-- · 2019-01-17 07:03

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!

查看更多
Bombasti
5楼-- · 2019-01-17 07:07

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

/***
 * @entity
 * @table(name="bans")
 */
查看更多
▲ chillily
6楼-- · 2019-01-17 07:11

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

<?php

//same code

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

//same
?>
查看更多
登录 后发表回答