0

使用带有标准应用程序结构的zend 2。我有实体:

module\University\src\University\Entity\Student.php
<?php
namespace University\Entity;

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

/**
 * @ORM\Entity
 * @ORM\Table(name="students")
 */
class Student
{   //more stuff
}

和一个表格

University\src\University\Form\StudentForm.php
<?php
namespace University\Form;

use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator;
use Zend\Form\Form;
use Zend\ServiceManager\ServiceManager;

class StudentForm extends Form
{
    parent::__construct('student-form');
    $entityManager = $serviceManager->get('Doctrine\ORM\EntityManager');

    $this->setHydrator(new DoctrineHydrator($entityManager, 'University\Entity\Student')); // this row cause the error

    // more stuff
}

在控制器中:

<?php
namespace University\Controller;

use Zend\Mvc\Controller\AbstractActionController,
    Zend\View\Model\ViewModel,
    University\Entity\Student,
    University\Form\StudentForm;

class StudentController extends AbstractActionController
{
    public function indexAction()
    {

        $form = new StudentForm($this->serviceLocator);
        // more stuffs
    }
}

教义给我带来了错误:

File:
\vendor\doctrine\common\lib\Doctrine\Common\Persistence\Mapping\MappingException.php:38
Message:
The class 'University\Entity\Student' was not found in the chain configured namespaces \Entity

我正在关注教程。

任何想法为什么我得到这个错误以及如何解决它?

编辑 我找到了如何解决这个问题以及它为什么引起的。答案被移动到主题答案中。

4

1 回答 1

0

我找到了解决方案。问题出在我的 module.config.php 中,我使用了以下教义设置:

'doctrine' => array(
    'driver' => array(
        __NAMESPACE__ . '_driver' => array(
            'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
            'cache' => 'array',
            'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity')
        ),
        'orm_default' => array(
            'drivers' => array(
                __NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver'
            )
        )
    )
)

不太确定如何编辑上面的代码以使其工作,但这就是我使它工作的方式:

// Doctrine config
'doctrine' => array(
    'driver' => array(
        // defines an annotation driver with two paths, and names it `my_annotation_driver`
        'my_annotation_driver' => array(
            'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
            'cache' => 'array',
            'paths' => array(
                __DIR__ . '/../src/University/Entity',
                'another/path'
            ),
        ),

        // default metadata driver, aggregates all other drivers into a single one.
        // Override `orm_default` only if you know what you're doing
        'orm_default' => array(
            'drivers' => array(
                // register `my_annotation_driver` for any entity under namespace `My\Namespace`
                'University\Entity' => 'my_annotation_driver'
            )
        )
    )
)

10x你们的帮助!

编辑: 我发现为什么第一个配置(使用NAMESPACES)不起作用,因为没有在 module.config.php 文件顶部设置任何命名空间,所以如果你想使用NAMESPACE注释进行配置,只需添加 'namespace你的模块名称;'

于 2014-04-25T09:54:13.030 回答