Класс не найден в цепочках имен

Я установил небольшое приложение с ZendFramework и Doctrine 2 в Windows Server с IIS.

Приложение работает нормально под Linux, но на моем компьютере с Windows я получаю следующую ошибку:

An error occurred during execution; please try again later.

Doctrine\Common\Persistence\Mapping\MappingException

C:\inetpub\wwwroot\system\vendor\doctrine\common\lib\Doctrine\Common\Persistence\Mapping\MappingException.php:38
The class '' was not found in the chain configured namespaces App\Common\Entity
#0 C:\inetpub\wwwroot\system\vendor\doctrine\common\lib\Doctrine\Common\Persistence\Mapping\Driver\MappingDriverChain.php(114): Doctrine\Common\Persistence\Mapping\MappingException::classNotFoundInNamespaces(false, Array)
#1 C:\inetpub\wwwroot\system\vendor\doctrine\orm\lib\Doctrine\ORM\Mapping\ClassMetadataFactory.php(113): Doctrine\Common\Persistence\Mapping\Driver\MappingDriverChain->loadMetadataForClass(false, Object(Doctrine\ORM\Mapping\ClassMetadata))
#2 C:\inetpub\wwwroot\system\vendor\doctrine\common\lib\Doctrine\Common\Persistence\Mapping\AbstractClassMetadataFactory.php(302): Doctrine\ORM\Mapping\ClassMetadataFactory->doLoadMetadata(Object(Doctrine\ORM\Mapping\ClassMetadata), NULL, false, Array)
#3 C:\inetpub\wwwroot\system\vendor\doctrine\common\lib\Doctrine\Common\Persistence\Mapping\AbstractClassMetadataFactory.php(205): Doctrine\Common\Persistence\Mapping\AbstractClassMetadataFactory->loadMetadata('App\Common\Enti...')
#4 C:\inetpub\wwwroot\system\vendor\doctrine\orm\lib\Doctrine\ORM\EntityManager.php(268): Doctrine\Common\Persistence\Mapping\AbstractClassMetadataFactory->getMetadataFor('App\Common\Enti...')
#5 C:\inetpub\wwwroot\system\vendor\doctrine\orm\lib\Doctrine\ORM\EntityManager.php(682): Doctrine\ORM\EntityManager->getClassMetadata('App\Common\Enti...')
#6 C:\inetpub\wwwroot\system\modules\App\Main\src\App\Main\Controller\IndexController.php(24): Doctrine\ORM\EntityManager->getRepository('App\Common\Enti...')
#7 C:\inetpub\wwwroot\system\vendor\zendframework\zendframework\library\Zend\Mvc\Controller\AbstractActionController.php(83): App\Main\Controller\IndexController->indexAction()
#8 [internal function]: Zend\Mvc\Controller\AbstractActionController->onDispatch(Object(Zend\Mvc\MvcEvent))
#9 C:\inetpub\wwwroot\system\vendor\zendframework\zendframework\library\Zend\EventManager\EventManager.php(468): call_user_func(Array, Object(Zend\Mvc\MvcEvent))
#10 C:\inetpub\wwwroot\system\vendor\zendframework\zendframework\library\Zend\EventManager\EventManager.php(207): Zend\EventManager\EventManager->triggerListeners('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure))
#11 C:\inetpub\wwwroot\system\vendor\zendframework\zendframework\library\Zend\Mvc\Controller\AbstractController.php(117): Zend\EventManager\EventManager->trigger('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure))
#12 C:\inetpub\wwwroot\system\vendor\zendframework\zendframework\library\Zend\Mvc\DispatchListener.php(114): Zend\Mvc\Controller\AbstractController->dispatch(Object(Zend\Http\PhpEnvironment\Request), Object(Zend\Http\PhpEnvironment\Response))
#13 [internal function]: Zend\Mvc\DispatchListener->onDispatch(Object(Zend\Mvc\MvcEvent))
#14 C:\inetpub\wwwroot\system\vendor\zendframework\zendframework\library\Zend\EventManager\EventManager.php(468): call_user_func(Array, Object(Zend\Mvc\MvcEvent))
#15 C:\inetpub\wwwroot\system\vendor\zendframework\zendframework\library\Zend\EventManager\EventManager.php(207): Zend\EventManager\EventManager->triggerListeners('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure))
#16 C:\inetpub\wwwroot\system\vendor\zendframework\zendframework\library\Zend\Mvc\Application.php(309): Zend\EventManager\EventManager->trigger('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure))
#17 C:\inetpub\wwwroot\index.php(25): Zend\Mvc\Application->run()
#18 {main}

Странная часть в том, что в ошибке... имя класса пусто. Что может быть??

-- ОБНОВИТЬ

Итак, это то, что я называю

$this->getEntityManager()->getRepository('App\Common\Entity\Setting');

И моя сущность:

namespace App\Common\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Common\Model\Repository\Settings")
 * @ORM\Table(name="settings")
 * @ORM\HasLifecycleCallbacks
 */
class Setting {

    /**
     * @ORM\Id
     * @ORM\Column(type="integer", nullable=false);
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\ManyToOne(targetEntity="\Etc\App\Entity\User")
     * @ORM\JoinColumn(name="author", referencedColumnName="id", onDelete="SET NULL")
     */
    protected $author;

    public function getId() {
        return $this->id;
    }

    public function setId($id) {
        $this->id = $id;
    }

    public function getAuthor() {
        return $this->author;
    }

    public function setAuthor(\Etc\App\Entity\User $author) {
        $this->author = $author;
    }

}

- ОБНОВЛЕНИЕ 2

namespace App\Common\Model\Repository;

class Settings {

    public function findAllFlatten() {
        // nothing relevant here.. 
    }

}



namespace Etc\App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Entity(repositoryClass="Etc\App\Model\Repository\User")
 * @ORM\Table(name="user")
 * @ORM\HasLifecycleCallbacks
 */
class User {

    /**
     * @ORM\Id
     * @ORM\Column(type="integer", nullable=false);
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string", length=48, unique=true, nullable=false)
     */
    protected $username;

    /**
     * @ORM\Column(type="string", length=64, nullable=false)
     */
    protected $password;

    public function getId() {
        return $this->id;
    }

    public function setId($id) {
        $this->id = $id;
    }

    public function getUsername() {
        return $this->username;
    }

    public function setUsername($username) {
        $this->username = $username;
    }

    public function getPassword() {
        return $this->password;
    }

    public function setPassword($password) {
        $this->password = $password;
    }

}

1 ответ

Это может быть немного поздно, но в моем случае проблема заключалась в кешировании классов композиторов. Я должен был выполнить

composer dump-autoload

чтобы решить эту проблему.

Все выглядит нормально, но можно видеть только то, что ваш репозиторий ничего не расширяет. это должно расширить класс хранилища доктрины:

<? 
   namespace App\Common\Model\Repository; 

   use Doctrine\ORM\EntityRepository; 

   class Settings extends EntityRepository { 
       /// ... 

   } 

Кроме того, вы настроили все пространства имен? помните, что в файлах конфигурации у вас есть конфиг доктрины, такой как:

'doctrine' => array (
                'driver' => array (
                        'mi_driver' => array (
                                'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
                                'cache' => 'array',
                                'paths' => array (
                                        __DIR__ . '/PATH_TO_CLASS_FILES' 
                                ) 
                        ),


                        'orm_default' => array (
                                'drivers' => array (
                                        "NAMESPACE"=>"mi_driver", "NAMESPACE2"=>"mi_driver",

                                ) 
                        ) 
                ) 
        ) 
);

А также проверьте, правильно ли настроен автозагрузчик. попробуйте просто создать экземпляр классов в любом месте вашего кода new App\Common\Entity\Setting()

Другие вопросы по тегам