Zend Framework 2 + Doctrine ODM, класс не найден в цепочке настроенных пространств имен?

При настройке ZF2+ODM получаю следующую ошибку:

The class 'Application\Document\User' was not found in the chain configured namespaces 

Текущая настройка выглядит следующим образом:

ZF2 стабильная, установленная доктрина ODM через composer.phar с содержимым composer.json

{
    "name": "zendframework/skeleton-application",
    "description": "Skeleton Application for ZF2",
    "license": "BSD-3-Clause",
    "keywords": [
        "framework",
        "zf2"
    ],
    "homepage": "http://framework.zend.com/",
    "minimum-stability": "dev",
    "require": {
        "php": ">=5.3.3",
        "zendframework/zendframework": "2.0.0",
        "doctrine/doctrine-mongo-odm-module": "dev-master"
    }
}

модули загружены

'modules' => array(
    'Application',
    'DoctrineModule',
    'DoctrineMongoODMModule',
),

создаются каталоги гидратора и прокси

$ ls -l data/DoctrineMongoODMModule/
total 0
drwxrwxrwx  2 wisu  staff  68 Sep 12 08:34 Hydrators
drwxrwxrwx  2 wisu  staff  68 Sep 12 08:35 Proxy

конфиг odm выглядит так

'driver' => array(
    'odm_default' => array(
        'drivers' => array(
            'Application\Document' => 'aplikasi'
        )
    ),
    'aplikasi' => array(
        'class' => 'Doctrine\ODM\MongoDB\Mapping\Driver\AnnotationDriver',
        'cache' => 'array',
        'paths' => array(
            'module/Application/src/Application/Document'
        )
    )
),

Я пытаюсь использовать следующее сопоставление

<?php

namespace Application\Document;

use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;

/** @ODM\Document(collection="user") */
class User
{
    /** @ODM\Id */
    private $id;

    /** @ODM\Field(type="string") */
    private $name;

    /**
     * @return the $id
     */
    public function getId() {
        return $this->id;
    }

    /**
     * @return the $name
     */
    public function getName() {
        return $this->name;
    }

    /**
     * @param field_type $id
     */
    public function setId($id) {
        $this->id = $id;
    }

    /**
     * @param field_type $name
     */
    public function setName($name) {
        $this->name = $name;
    }

}

но вызывая его через

<?php

namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Application\Document\User;

class IndexController extends AbstractActionController
{
    public function indexAction()
    {

        $dm = $this->getServiceLocator()->get('doctrine.documentmanager.odm_default');

        $user = new User();
        $user->setName("Gembul");

        $dm->persist($user);
        $dm->flush();

        return new ViewModel();
    }
}

Любые указатели?


person Wisu Suntoyo    schedule 22.09.2012    source источник
comment
Я не думаю, что предоставленный ответ является правильным. У кого-нибудь еще есть мысли, в чем может быть дело?   -  person Sam152    schedule 18.11.2012


Ответы (3)


Реальным решением является не добавление module.doctrine-mongo-odm.local.php в каталог автозагрузки, эти строки работали для меня как конфигурация

    'driver' => array(          
        'ODM_Driver' => array(
            'class' => 'Doctrine\ODM\MongoDB\Mapping\Driver\AnnotationDriver',
            'paths' => array(__DIR__ . '/../../module/Application/src/Application/Doctrine/Document')
        ),
        'odm_default' => array(
            'drivers' => array(
                'Application\Doctrine\Document' => 'ODM_Driver'
            )
        ),
    ),
person siesta    schedule 21.11.2012

Эта установка отлично работает с текущими версиями: установка ZF2, MongoDB и Doctrine

Скопируйте файл конфигурации odm по умолчанию в наш каталог конфигурации. Затем вам нужно будет изменить module.doctrine-mongo-odm.local.php в соответствии с вашими спецификациями сервера. Это файл конфигурации, в котором вы устанавливаете хосты сервера, порты, имя пользователя и пароли. Например, мы предположим, что все работает на одной и той же локальной машине, и не будем вносить никаких изменений.

Это приложение module.config.php, которое будет работать для гибридного решения ORM/ODM:

'doctrine' => array(
    'driver' => array(
        'orm_driver' => array(
            'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
            'cache' => 'array',
            'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity')
        ),
        'orm_default' => array(
            'drivers' => array(
                __NAMESPACE__ . '\Entity' => 'orm_driver'
            )
        ),
        'odm_driver' => array(
            'class' => 'Doctrine\ODM\MongoDB\Mapping\Driver\AnnotationDriver',          
            'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Document')
        ),
        'odm_default' => array(
            'drivers' => array(
                __NAMESPACE__ . '\Document' => 'odm_driver'
            )
        )                   
    )
)  
person webDEVILopers    schedule 09.01.2013

Выяснил проблему...

Файл конфигурации module.doctrine-mongo-odm.local.php не находился в каталоге автозагрузки...

person Wisu Suntoyo    schedule 24.09.2012
comment
Вы уверены, что это действительно было решением? У меня такая же проблема с использованием DoctrineORMModule. Я пытался поместить массив конфигурации доктрины на глобальный уровень, а также вызвать его с уровня модуля, и я всегда получаю ту же ошибку. - person Jeremy Hicks; 25.10.2012