我试图用doctrine设置symfony,配置doctrine对我来说是新的。
我尝试使用控制器中的以下代码从数据库中检索实体:
$feedImport = $this->getDoctrine()->getRepository(MyClass::class);
但我一直收到MappingException
错误:
The class 'AppBundle\Entity\MyClass' was not found in the chain configured namespaces
我还尝试手动指定完全限定的类名。但这没有任何帮助。
然而,我对它的看法,错误消息似乎暗示我需要做一些额外的配置:我需要将我的实体/存储库添加到"配置的命名空间链#34;。但是我在找到这个链以及如何配置它时遇到了一些麻烦(如果我的假设是正确的话)
问题#1:是否存在某种命名空间链?如果在哪里可以看到如何配置它的示例?
所有实体信息都在我的AppBundle
捆绑中。看下面的捆绑结构:
...
└── AppBundle
├── AppBundle.php
├── Controller
│ └── DefaultController.php
├── Entity
│ └── MyClass.php
├── Repository
│ └── MyClassRepository.php
└── Resources
└── config
└── doctrine
└── MyClass.orm.yml
...
我使用symfony bin\console
工具生成了实体类/ repository / orm.yml文件。
如果我使用相同的console
工具检查学说映射信息:
doctrine:mapping:info
命令我告诉我这些类是正确/成功映射的:
Found 1 mapped entity:
[OK] AppBundle\Entity\MyClass
关于生成模型/实体配置文件的过程。
我使用symfony console
工具生成元数据yaml文件。通过运行命令:doctrine:mapping:import
。在创建的yml文件之后,我使用了' doctrine:generate:entities'生成enity类。
我的印象是,如果生成并存储在Entity
文件夹中的工作包中的文件,auto_mapping: true
会自动处理此映射内容。
这个假设是否正确?如果没有,请告诉我有什么问题。
实体文件和配置存储在工作包AppBundle
AppBundle
已注册并正常工作(控制器正在做他的事情)
doctrine:mapping:info
似乎立即映射实体。有关实体模型的完整代码:
<?php
namespace AppBundle\Entity;
/**
* MyClass
*/
class MyClass
{
/**
* @var integer
*/
private $id;
/**
* @var integer
*/
private $customerId;
/**
* @var integer
*/
private $feedId;
/**
* @var string
*/
private $contentHash;
/**
* @var string
*/
private $headerHash;
/**
* @var string
*/
private $feedName;
/**
* @var integer
*/
private $fileSize;
/**
* @var integer
*/
private $totalHeaderFields;
/**
* @var integer
*/
private $totalRecords;
/**
* @var string
*/
private $importStatus;
/**
* @var \DateTime
*/
private $datetimeCreated = 'CURRENT_TIMESTAMP';
/**
* @var \DateTime
*/
private $datetimeProcessed;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set customerId
*
* @param integer $customerId
*
* @return MyClass
*/
public function setCustomerId($customerId)
{
$this->customerId = $customerId;
return $this;
}
/**
* Get customerId
*
* @return integer
*/
public function getCustomerId()
{
return $this->customerId;
}
/**
* Set feedId
*
* @param integer $feedId
*
* @return MyClass
*/
public function setFeedId($feedId)
{
$this->feedId = $feedId;
return $this;
}
/**
* Get feedId
*
* @return integer
*/
public function getFeedId()
{
return $this->feedId;
}
/**
* Set contentHash
*
* @param string $contentHash
*
* @return MyClass
*/
public function setContentHash($contentHash)
{
$this->contentHash = $contentHash;
return $this;
}
/**
* Get contentHash
*
* @return string
*/
public function getContentHash()
{
return $this->contentHash;
}
/**
* Set headerHash
*
* @param string $headerHash
*
* @return MyClass
*/
public function setHeaderHash($headerHash)
{
$this->headerHash = $headerHash;
return $this;
}
/**
* Get headerHash
*
* @return string
*/
public function getHeaderHash()
{
return $this->headerHash;
}
/**
* Set feedName
*
* @param string $feedName
*
* @return MyClass
*/
public function setFeedName($feedName)
{
$this->feedName = $feedName;
return $this;
}
/**
* Get feedName
*
* @return string
*/
public function getFeedName()
{
return $this->feedName;
}
/**
* Set fileSize
*
* @param integer $fileSize
*
* @return MyClass
*/
public function setFileSize($fileSize)
{
$this->fileSize = $fileSize;
return $this;
}
/**
* Get fileSize
*
* @return integer
*/
public function getFileSize()
{
return $this->fileSize;
}
/**
* Set totalHeaderFields
*
* @param integer $totalHeaderFields
*
* @return MyClass
*/
public function setTotalHeaderFields($totalHeaderFields)
{
$this->totalHeaderFields = $totalHeaderFields;
return $this;
}
/**
* Get totalHeaderFields
*
* @return integer
*/
public function getTotalHeaderFields()
{
return $this->totalHeaderFields;
}
/**
* Set totalRecords
*
* @param integer $totalRecords
*
* @return MyClass
*/
public function setTotalRecords($totalRecords)
{
$this->totalRecords = $totalRecords;
return $this;
}
/**
* Get totalRecords
*
* @return integer
*/
public function getTotalRecords()
{
return $this->totalRecords;
}
/**
* Set importStatus
*
* @param string $importStatus
*
* @return MyClass
*/
public function setImportStatus($importStatus)
{
$this->importStatus = $importStatus;
return $this;
}
/**
* Get importStatus
*
* @return string
*/
public function getImportStatus()
{
return $this->importStatus;
}
/**
* Set datetimeCreated
*
* @param \DateTime $datetimeCreated
*
* @return MyClass
*/
public function setDatetimeCreated($datetimeCreated)
{
$this->datetimeCreated = $datetimeCreated;
return $this;
}
/**
* Get datetimeCreated
*
* @return \DateTime
*/
public function getDatetimeCreated()
{
return $this->datetimeCreated;
}
/**
* Set datetimeProcessed
*
* @param \DateTime $datetimeProcessed
*
* @return MyClass
*/
public function setDatetimeProcessed($datetimeProcessed)
{
$this->datetimeProcessed = $datetimeProcessed;
return $this;
}
/**
* Get datetimeProcessed
*
* @return \DateTime
*/
public function getDatetimeProcessed()
{
return $this->datetimeProcessed;
}
}
任何建议的话都表示赞赏!
答案 0 :(得分:0)
试试这个:
$feedImport = $this->getDoctrine()->getRepository('AppBundle:MyClass');
如果您想访问特定的功能/方法
$feedImport = $this->getDoctrine()->getRepository('AppBundle:MyClass')->sampleMethod();
答案 1 :(得分:0)
您的捆绑包未在AppKernel文件中声明,或者您的学说映射未重新协调。
你的AppKernel应该有:
public function registerBundles()
{
$bundles = array(
...
new AppBundle\AppBundle(),
);
....
return $bundles;
}
默认情况下,你的config.yml:
orm:
auto_generate_proxy_classes: %kernel.debug%
auto_mapping: true
答案 2 :(得分:0)
试试这个:
/**
*
* @ORM\Table(name="my_table_name")
* @ORM\Entity()
*/
class MyClass
答案 3 :(得分:0)
经过长时间的斗争,我发现了导致问题的原因。
我的symfony环境以prod
模式运行。我切换到dev
。这一切都像魅力一样。
但是我还在想为什么?!我查看了AppKernel.php
,看起来像是:
$bundles = [
new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
new Symfony\Bundle\SecurityBundle\SecurityBundle(),
new Symfony\Bundle\TwigBundle\TwigBundle(),
new Symfony\Bundle\MonologBundle\MonologBundle(),
new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(),
new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
new AppBundle\AppBundle(),
];
if (in_array($this->getEnvironment(), ['dev', 'test'], true)) {
$bundles[] = new Symfony\Bundle\DebugBundle\DebugBundle();
$bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
$bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle();
if ('dev' === $this->getEnvironment()) {
$bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle();
$bundles[] = new Symfony\Bundle\WebServerBundle\WebServerBundle();
}
}
return $bundles;
在我看来,无论我运行什么环境,都会加载教义。有人可以向我解释这种行为背后的原因。
编辑:
我发现了更多内容,我再次切换到prod
环境,但现在我开始打开/关闭调试。
现在我看到它在生产模式下运行良好但仅在启用调试时才有效。为什么?