类'DoctrineModuleStdlibHydratorDoctrineObject'在链配置的命名空间


The class 'DoctrineModuleStdlibHydratorDoctrineObject' was not found in the chain configured namespaces

请帮忙。

我在提交表单时收到此例外。我使用 Zend Framework 2 和 DoctrineORMModule。

我通过下一个命令生成了我的实体

php doctrine-module orm:convert-mapping annotation module/Globuserp/src/ --namespace="Globuserp'Entity''" --from-database
php doctrine-module orm:generate-entities module/Globuserp/src/ --generate-annotations=true

堆栈跟踪:


    #0 /var/www/globus-erp.local/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php(113): Doctrine'Common'Persistence'Mapping'MappingException::classNotFoundInNamespaces('DoctrineModule''...', Array)
    #1 /var/www/globus-erp.local/vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php(117): Doctrine'Common'Persistence'Mapping'Driver'MappingDriverChain->loadMetadataForClass('DoctrineModule''...', Object(Doctrine'ORM'Mapping'ClassMetadata))
    #2 /var/www/globus-erp.local/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php(318): Doctrine'ORM'Mapping'ClassMetadataFactory->doLoadMetadata(Object(Doctrine'ORM'Mapping'ClassMetadata), NULL, false, Array)
    #3 /var/www/globus-erp.local/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php(211): Doctrine'Common'Persistence'Mapping'AbstractClassMetadataFactory->loadMetadata('DoctrineModule''...')
    #4 /var/www/globus-erp.local/vendor/doctrine/orm/lib/Doctrine/ORM/EntityManager.php(265): Doctrine'Common'Persistence'Mapping'AbstractClassMetadataFactory->getMetadataFor('DoctrineModule''...')
    #5 /var/www/globus-erp.local/vendor/doctrine/doctrine-module/src/DoctrineModule/Stdlib/Hydrator/DoctrineObject.php(119): Doctrine'ORM'EntityManager->getClassMetadata('DoctrineModule''...')
    #6 /var/www/globus-erp.local/vendor/doctrine/doctrine-module/src/DoctrineModule/Stdlib/Hydrator/DoctrineObject.php(102): DoctrineModule'Stdlib'Hydrator'DoctrineObject->prepare(NULL)
    #7 /var/www/globus-erp.local/vendor/zendframework/zendframework/library/Zend/Form/Fieldset.php(591): DoctrineModule'Stdlib'Hydrator'DoctrineObject->hydrate(Array, NULL)
    #8 /var/www/globus-erp.local/vendor/zendframework/zendframework/library/Zend/Form/Element/Collection.php(274): Zend'Form'Fieldset->bindValues(Array)
    #9 /var/www/globus-erp.local/vendor/zendframework/zendframework/library/Zend/Form/Fieldset.php(584): Zend'Form'Element'Collection->bindValues(Array)
    #10 /var/www/globus-erp.local/vendor/zendframework/zendframework/library/Zend/Form/Fieldset.php(584): Zend'Form'Fieldset->bindValues(Array)
    #11 /var/www/globus-erp.local/vendor/zendframework/zendframework/library/Zend/Form/Form.php(364): Zend'Form'Fieldset->bindValues(Array)
    #12 /var/www/globus-erp.local/vendor/zendframework/zendframework/library/Zend/Form/Form.php(513): Zend'Form'Form->bindValues()
    #13 /var/www/globus-erp.local/module/Globuserp/src/Globuserp/Controller/IndexController.php(85): Zend'Form'Form->isValid()
    #14 /var/www/globus-erp.local/vendor/zendframework/zendframework/library/Zend/Mvc/Controller/AbstractActionController.php(83): Globuserp'Controller'IndexController->addNewProjectAction()
    #15 /var/www/globus-erp.local/module/Application/src/Application/Controller/BaseController.php(20): Zend'Mvc'Controller'AbstractActionController->onDispatch(Object(Zend'Mvc'MvcEvent))
    #16 /var/www/globus-erp.local/module/Application/src/Application/Controller/BaseAdminController.php(17): Application'Controller'BaseController->onDispatch(Object(Zend'Mvc'MvcEvent))
    #17 [internal function]: Application'Controller'BaseAdminController->onDispatch(Object(Zend'Mvc'MvcEvent))
    #18 /var/www/globus-erp.local/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php(468): call_user_func(Array, Object(Zend'Mvc'MvcEvent))
    #19 /var/www/globus-erp.local/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php(207): Zend'EventManager'EventManager->triggerListeners('dispatch', Object(Zend'Mvc'MvcEvent), Object(Closure))
    #20 /var/www/globus-erp.local/vendor/zendframework/zendframework/library/Zend/Mvc/Controller/AbstractController.php(117): Zend'EventManager'EventManager->trigger('dispatch', Object(Zend'Mvc'MvcEvent), Object(Closure))
    #21 /var/www/globus-erp.local/vendor/zendframework/zendframework/library/Zend/Mvc/DispatchListener.php(114): Zend'Mvc'Controller'AbstractController->dispatch(Object(Zend'Http'PhpEnvironment'Request), Object(Zend'Http'PhpEnvironment'Response))
    #22 [internal function]: Zend'Mvc'DispatchListener->onDispatch(Object(Zend'Mvc'MvcEvent))
    #23 /var/www/globus-erp.local/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php(468): call_user_func(Array, Object(Zend'Mvc'MvcEvent))
    #24 /var/www/globus-erp.local/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php(207): Zend'EventManager'EventManager->triggerListeners('dispatch', Object(Zend'Mvc'MvcEvent), Object(Closure))
    #25 /var/www/globus-erp.local/vendor/zendframework/zendframework/library/Zend/Mvc/Application.php(316): Zend'EventManager'EventManager->trigger('dispatch', Object(Zend'Mvc'MvcEvent), Object(Closure))
    #26 /var/www/globus-erp.local/public/index.php(17): Zend'Mvc'Application->run()
    #27 {main}

索引控制器


    namespace Globuserp'Controller;
    use Application'Controller'BaseAdminController as BaseController;
    use Globuserp'Form'AddNewEmployeeForm;
    use Globuserp'Form'AddNewProjectForm;
    use Globuserp'Entity'Projects;
    use Zend'View'Model'ViewModel;
    use Zend'Http'Response;
    use DoctrineModule'Stdlib'Hydrator'DoctrineObject as DoctrineHydrator;
    class IndexController extends BaseController
    {
       //...
         public function addNewProjectAction()
         {
            $em = $this->getEntityManager();
            $form = new AddNewProjectForm($em, 'addNewProject');
            $request = $this->getRequest();
            if($request->isPost())
            {
                $data = $request->getPost();
                $newProject = new Projects();
                $form->setHydrator(new DoctrineHydrator($em, ''Projects'));
                $form->bind($newProject);
                $form->setData($data);
                if($form->isValid())
                {
                    var_dump($newProject);
                }
            }
            else
            {
                $result = new ViewModel(array('form' => $form));
                $result->setTerminal(true);
                return $result;
            }

       }
    }

基础控制器


    namespace Application'Controller;
    use Zend'Mvc'Controller'AbstractActionController;
    class BaseController extends AbstractActionController
    {
    protected $entityManager;
    public function onDispatch('Zend'Mvc'MvcEvent $e){
        $this->setEntityManager($this->getServiceLocator()->get("'Doctrine'ORM'EntityManager"));
        return parent::onDispatch($e);
    }
    public function setEntityManager('Doctrine'ORM'EntityManager $entity)
    {
        $this->entityManager = $entity;
    }
    public function getEntityManager()
    {
        return $this->entityManager;
    }
    }

添加新项目窗体


    namespace Globuserp'Form;
    use Application'Form'BaseForm;
    use Globuserp'Form'EmployeeFieldset;
    use Globuserp'Form'ProjectFieldset;
    use DoctrineModule'Stdlib'Hydrator'DoctrineObject as DoctrineHydrator;
    class AddNewProjectForm extends BaseForm
    {

    public function createElements()
    {
        $this->setAttribute('method', 'post');
        $this->setAttribute('enctype', 'multipart/form-data');
        $projectFieldset = new ProjectFieldset('project', $this->objectManager,         new DoctrineHydrator($this->objectManager, ''Globuserp'Entity'Projects'));

        $this->add($projectFieldset);


        $this->add(array(
            'name' => 'submit',
            'type' => 'Submit',
            'attributes' => array(
                'value' => 'Сохранить',
                'id' => 'btn_submit',
                'class' => 'btn btn-primary'
            )
        ));
       }
    }

基本窗体


    namespace Application'Form;
    use Zend'Form'Form;
    use DoctrineModule'Persistence'ObjectManagerAwareInterface;
    use Doctrine'Common'Persistence'ObjectManager;
    abstract class BaseForm extends Form implements ObjectManagerAwareInterface
    {
        protected $objectManager;
        public function setObjectManager(ObjectManager $objectManager)
        {
            $this->objectManager = $objectManager;
        }
        public function getObjectManager()
        {
            return $this->objectManager;
        }
        public function __construct(ObjectManager $objectManager, $name=null)
        {
            parent::__construct($name);
            $this->setObjectManager($objectManager);
            $this->createElements();
        }
        abstract public function createElements();
   }

员工字段集


    namespace Globuserp'Form;
    use Application'Form'BaseFieldset;
    use Doctrine'Common'Persistence'ObjectManager;
    use DoctrineModule'Stdlib'Hydrator'DoctrineObject as DoctrineHydrator;
    class EmployeeFieldset extends BaseFieldset
    {
        public function __construct($name, ObjectManager $objectManager)
        {
            parent::__construct($name, $objectManager);
            $this->setHydrator(new DoctrineHydrator($this->objectManager, ''Log'));
        }
        public function createElements()
        {
            $this->add(array(
                'name' => 'employee',
                'type' => 'DoctrineModule'Form'Element'ObjectSelect',
                'options' => array(
                    'label' => 'Имя сотрудника',
                    'object_manager' => $this->objectManager,
                    'target_class' => 'Globuserp'Entity'Staff',
                    'property' => 'fullname',
                    'label_generator' => function($targetEntity)
                    {
                        return $targetEntity->getFullname();
                    }
                ),
                'attributes' => array(
                    'class' => 'form-control',
                    'required' => 'required',
                )
        ));

        $this->add(array(
            'name' => 'startTime',
            'type' => 'Text',
            'options' => array(
                'min' => 3,
                'max' => 100,
                'label' => 'Время работы на проекте'
            ),
            'attributes' => array(
                'class' => 'form-control input-small',
                'required' => 'required'
            )
        ));

        $this->add(array(
            'name' => 'endTime',
            'type' => 'Text',
            'options' => array(
                'min' => 3,
                'max' => 100,
            ),
            'attributes' => array(
                'class' => 'form-control input-small input-small-last',
                'required' => 'required'
                )
          ));
        }
    }

项目字段集


    namespace Globuserp'Form;
    use Application'Form'BaseFieldset;
    use Doctrine'Common'Persistence'ObjectManager;
    use DoctrineModule'Stdlib'Hydrator'DoctrineObject as DoctrineHydrator;
    use Globuserp'Entity'Projects;
    class ProjectFieldset extends BaseFieldset
    {
        public function __construct($name, ObjectManager $objectManager, DoctrineHydrator $hydrator)
        {
            parent::__construct($name, $objectManager);
            $this->setHydrator($hydrator);
            $project = new Projects();
            $this->setObject($project);
        }
        public function createElements()
        {
            $this->add(array(
                'name' => 'title',
                'type' => 'Text',
                'options' => array(
                    'min' => 3,
                   'max' => 100,
                    'label' => 'Наименование'
                ),
                'attributes' => array(
                    'class' => 'form-control',
                    'required' => 'required'
                )
            ));
            $this->add(array(
                'name' => 'color',
                'type' => 'DoctrineModule'Form'Element'ObjectSelect',
                'options' => array(
                    'label' => 'Цвет',
                    'object_manager' => $this->objectManager,
                    'target_class' => 'Globuserp'Entity'ProjectsColors',
                    'label_generator' => function($targetEntity)
                    {
                        return $targetEntity->getTitle() . "#". $targetEntity->getValue() ."";
                    }
                ),
                'attributes' => array(
                    'class' => 'form-control color',
                    'required' => 'required',
                )
            ));
            $this->add(array(
                'name' => 'description',
                'type' => 'Textarea',
                'options' => array(
                    'min' => 3,
                    'max' => 100,
                    'label' => 'Описание'
                ),
                'attributes' => array(
                    'class' => 'form-control',
                    'required' => 'required'
                )
            ));
            $this->add(array(
                'type' => 'Zend'Form'Element'Collection',
                'name' => 'employee',
                'options' => array(
                    'label' => 'Добавить сотрудника',
                    'should_create_template' => true,
                    'target_element' => new EmployeeFieldset('employee', $this->objectManager)
                )
            ));
        }
    }

基本字段集


namespace Application'Form;
use Zend'Form'Fieldset;
use Doctrine'Common'Persistence'ObjectManager;
abstract class BaseFieldset extends Fieldset
{
    protected $objectManager;
    /**
     * @param mixed $objectManager
     */
    public function setObjectManager(ObjectManager $objectManager)
    {
        $this->objectManager = $objectManager;
    }
    /**
     * @return mixed
     */
    public function getObjectManager()
    {
        return $this->objectManager;
    }
    public function __construct($name, ObjectManager $objectManager)
    {
        parent::__construct($name);
        $this->setObjectManager($objectManager);
        $this->createElements();
    }
    abstract public function createElements();
}

项目.php

 
namespace Globuserp'Entity;
use Doctrine'ORM'Mapping as ORM;
/**
 * Projects
 *
 * @ORM'Table(name="projects", indexes={@ORM'Index(name="projects_ibfk_1", columns={"color"})})
 * @ORM'Entity
 */
class Projects
{
    /**
     * @var integer
     *
     * @ORM'Column(name="id", type="integer", nullable=false)
     * @ORM'Id
     * @ORM'GeneratedValue(strategy="IDENTITY")
     */
    private $id;
    /**
     * @var string
     *
     * @ORM'Column(name="title", type="string", length=255, nullable=false)
     */
    private $title;
    /**
     * @var string
     *
     * @ORM'Column(name="description", type="text", length=65535, nullable=true)
     */
    private $description;
    /**
     * @var 'Globuserp'Entity'ProjectsColors
     *
     * @ORM'ManyToOne(targetEntity="Globuserp'Entity'ProjectsColors")
     * @ORM'JoinColumns({
     *   @ORM'JoinColumn(name="color", referencedColumnName="id")
     * })
     */
    private $color;

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }
    /**
     * Set title
     *
     * @param string $title
     * @return Projects
     */
    public function setTitle($title)
    {
        $this->title = $title;
        return $this;
    }
    /**
     * Get title
     *
     * @return string 
     */
    public function getTitle()
    {
        return $this->title;
    }
    /**
     * Set description
     *
     * @param string $description
     * @return Projects
     */
    public function setDescription($description)
    {
        $this->description = $description;
        return $this;
    }
    /**
     * Get description
     *
     * @return string 
     */
    public function getDescription()
    {
        return $this->description;
    }
    /**
     * Set color
     *
     * @param 'Globuserp'Entity'ProjectsColors $color
     * @return Projects
     */
    public function setColor('Globuserp'Entity'ProjectsColors $color = null)
    {
        $this->color = $color;
        return $this;
    }
    /**
     * Get color
     *
     * @return 'Globuserp'Entity'ProjectsColors 
     */
    public function getColor()
    {
        return $this->color;
    }
}

日志.php


namespace Globuserp'Entity;
use Doctrine'ORM'Mapping as ORM;

/**
 * Log
 *
 * @ORM'Table(name="log", indexes={@ORM'Index(name="id_project", columns={"id_project"}), @ORM'Index(name="id_staff", columns={"id_staff"})})
 * @ORM'Entity
 */
class Log
{
    /**
     * @var integer
     *
     * @ORM'Column(name="id", type="integer", nullable=false)
     * @ORM'Id
     * @ORM'GeneratedValue(strategy="IDENTITY")
     */
    private $id;
    /**
     * @var 'DateTime
     *
     * @ORM'Column(name="start_time", type="datetime", nullable=false)
     */
    private $startTime;
    /**
     * @var 'DateTime
     *
     * @ORM'Column(name="end_time", type="datetime", nullable=false)
     */
    private $endTime;
    /**
     * @var 'Globuserp'Entity'Projects
     *
     * @ORM'ManyToOne(targetEntity="Globuserp'Entity'Projects")
     * @ORM'JoinColumns({
     *   @ORM'JoinColumn(name="id_project", referencedColumnName="id")
     * })
     */
    private $idProject;
    /**
     * @var 'Globuserp'Entity'Staff
     *
     * @ORM'ManyToOne(targetEntity="Globuserp'Entity'Staff")
     * @ORM'JoinColumns({
     *   @ORM'JoinColumn(name="id_staff", referencedColumnName="id")
     * })
     */
    private $idStaff;

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }
    /**
     * Set startTime
     *
     * @param 'DateTime $startTime
     * @return Log
     */
    public function setStartTime($startTime)
    {
        $this->startTime = $startTime;
        return $this;
    }
    /**
     * Get startTime
     *
     * @return 'DateTime 
     */
    public function getStartTime()
    {
        return $this->startTime;
    }
    /**
     * Set endTime
     *
     * @param 'DateTime $endTime
     * @return Log
     */
    public function setEndTime($endTime)
    {
        $this->endTime = $endTime;
        return $this;
    }
    /**
     * Get endTime
     *
     * @return 'DateTime 
     */
    public function getEndTime()
    {
        return $this->endTime;
    }
    /**
     * Set idProject
     *
     * @param 'Globuserp'Entity'Projects $idProject
     * @return Log
     */
    public function setIdProject('Globuserp'Entity'Projects $idProject = null)
    {
        $this->idProject = $idProject;
        return $this;
    }
    /**
     * Get idProject
     *
     * @return 'Globuserp'Entity'Projects 
     */
    public function getIdProject()
    {
        return $this->idProject;
    }
    /**
     * Set idStaff
     *
     * @param 'Globuserp'Entity'Staff $idStaff
     * @return Log
     */
    public function setIdStaff('Globuserp'Entity'Staff $idStaff = null)
    {
        $this->idStaff = $idStaff;
        return $this;
    }
    /**
     * Get idStaff
     *
     * @return 'Globuserp'Entity'Staff 
     */
    public function getIdStaff()
    {
        return $this->idStaff;
    }
}

你试着给NULL补水。因此,不知何故,您在没有实体的情况下补水 检查堆栈跟踪:

DoctrineModule'Stdlib'Hydrator'DoctrineObject->hydrate(Array, NULL)

所以你需要看看这个。也许您忘记初始化收藏或其他内容?或者,您尝试水化NULL对象。

我忘记了在EmployeeFildset构造函数中执行setObject方法。正确的版本应如下所示

public function __construct($name, ObjectManager $objectManager)
{
    parent::__construct($name, $objectManager);
    $this->setHydrator(new DoctrineHydrator($this->objectManager, ''Log'));
    $logEntry = new Log();
    $this->setObject($logEntry);
}