不起作用 - zf2 CRUD mongo

时间:2013-01-31 02:13:08

标签: php mongodb doctrine-orm zend-framework2

我正在尝试使用mongodb使用doctrine 2和zend framework 2构建一个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'));
    }
}

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

1 个答案:

答案 0 :(得分:0)

我已经使用了DoctrineMongoODMModule,并拥有自己的库,可以帮助连接zf2 doctrine和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"标题。

要阅读单个项目,请发送一个ID为GET的请求:

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)

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

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

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

要进行更新,请将PUT请求与json内容一起发送到特定ID。例如:

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

content-
{fieldA: 'def'}

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

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

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