Класс не найден в цепочках имен
Я установил небольшое приложение с 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()