0

我正在尝试使用学说 2 和 zend 框架 2 使用 mongodb 构建 CRUD。

我遵循了一些教程,但仍然失败。

按照链接: http: //www.bigwisu.com/2012/10/03/zend-framework-2-doctrine-odm https://github.com/doctrine/DoctrineMongoODMModule

以下是项目中使用的配置:

module.doctrine_mongodb.local.config.php

<?php
return array(
    'doctrine' => array(
        'connection' => array(
            'odm_default' => array(
                'server'    => 'localhost',
                'port'      => '27017',
                'dbname'    => 'teste',
                'options'   => array()
            ),
        ),
        'configuration' => array(
            'odm_default' => array(
                'metadata_cache'     => 'array',
                'driver'             => 'odm_default',
                'generate_proxies'   => true,
                'proxy_dir'          => 'data/DoctrineMongoODMModule/Proxy',
                'proxy_namespace'    => 'DoctrineMongoODMModule\Proxy',
                'generate_hydrators' => true,
                'hydrator_dir'       => 'data/DoctrineMongoODMModule/Hydrator',
                'hydrator_namespace' => 'DoctrineMongoODMModule\Hydrator',
                'default_db'         => 'teste',
                'filters'            => array()
            )
        ),

        'documentmanager' => array(
            'odm_default' => array(
            //    'connection'    => 'odm_default',
            //    'configuration' => 'odm_default',
            //    'eventmanager' => 'odm_default'
            )
        ),
        'eventmanager' => array(
            'odm_default' => array(
                'subscribers' => array()
            )
        ),
    ),
);

module.config.php 添加

'doctrine' => array(
        'driver' => array(           
            __NAMESPACE__.'_driver' => array(
                'class' => 'Doctrine\ODM\MongoDB\Mapping\Driver\AnnotationDriver',         
                'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Document')
            ),
            'odm_default' => array(
                'drivers' => array(
                    __NAMESPACE__ . '\Document' => __NAMESPACE__.'_driver'
                )
            )                  
        )
    )

文档\Artigo.php

<?php
namespace Site\Document;
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;

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

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

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

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

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

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

}

和控制器:

<?php

namespace Site\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Site\Document\Artigo;

class IndexController extends AbstractActionController
{
    public function indexAction()
    {
        $dm = $this->getServiceLocator()->get('doctrine.documentmanager.odm_default'); 
        $artigo = new Artigo();
        $artigo>setNome("teste");
        $dm->persist($artigo);
        $dm->flush();

        return new ViewModel(array('teste'=>'acho que deu'));
    }
}

没有错误发生,也没有插入记录。你知道可以是什么吗?

4

1 回答 1

0

我在 DoctrineMongoODMModule 上工作过,并且有自己的库可以帮助连接 zf2 学说和 mongo。如果您想为学说文档创建一个 json REST 端点,请按以下方法...

将以下内容添加到您的 composer.json:

    "superdweebie/doctrine-extensions-module": "dev-master"

更新作曲家。

在你的注册这些模块application.config.php

'modules' => array(
    'Sds\Zf2ExtensionsModule',
    'DoctrineModule',
    'DoctrineMongoODMModule',       
    'Sds\DoctrineExtensionsModule',       
),

然后添加您的模块配置之一:

'sds' => [
    'doctrineExtensions' => [
        'doctrine' => [
            'driver' => 'odm_default',
            'eventmanager' => 'odm_default',
            'configuration' => 'odm_default',
            'documentManager' => 'doctrine.documentmanager.odm_default',
        ],
        'extensionConfigs' => [
            'Sds\DoctrineExtensions\Rest' => true,
        ],
    ],               
],

'router' => [
    'routes' => [
        'Sds\Zf2ExtensionsModule\RestRoute' => [
            'type' => 'Sds\Zf2ExtensionsModule\RestRoute',
            'options' => [
                'route' => '/rest',
                'defaults' => [
                    'controller' => 'Sds\DoctrineExtensionsModule\Controller\JsonRestfulController'
                ],
            ],
        ],
    ],
],

然后将@Sds\Rest注释添加到您的文档中:

use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;
use Sds\DoctrineExtensions\Annotation\Annotations as Sds;

/**
 * @ODM\Document
 * @Sds\Rest
 */
class MyDocument{
    ...
}

而已。

现在您可以像这样使用 REST 服务:

其余端点位于http://mysite.com/rest/mydocument

要从任何请求中获取 json,请包含accept: "application/json"标头。要使用任何请求发送 json,请包含content-type: "application/json"标头。

要读取单个项目,请发送GET带有 id 的请求:

http://mysite.com/rest/mydocument/itemid

要阅读列表,请发送GET请求至:

http://mysite.com/rest/mydocument

列出产品时,默认返回前 30 个。要改变这一点,请使用范围标头,例如:

range: items=5-10

即使请求的项目超过 30 个,也最多返回 30 个。响应将具有以下标头,以指示已返回哪些项目以及总共有多少项目:

Content-Range: items 0-24/66

可以使用查询字符串查询该列表。例如:

http://mysite.com/rest/mydocument?fieldA=filterValue

可以使用查询字符串对列表进行排序。例如,将按类型排序,然后按名称降序:

http://mysite.com/rest/mydocument?sort(+type,-name)

要创建,发送一个POST带有 json 内容的请求。例如:

request-
http://mysite.com/rest/mydocument

content-
{id: 1234, fieldA: 'abc'}

要更新,请发送PUT带有 json 内容的请求到特定 id。例如:

request-
http://mysite.com/rest/mydocument/1234

content-
{fieldA: 'def'}

DELETE要删除,请向特定 ID发送请求。例如:

http://mysite.com/rest/mydocument/1234

这些模块的文档开头可以在https://sds.readthedocs.org/en/latest/找到。还有其他这里没有描述的功能与dojo客户端框架、控件序列化和访问控制集成。

于 2013-01-31T10:34:10.650 回答