【问题标题】:Symfony + MongoDB driver issueSymfony + MongoDB 驱动程序问题
【发布时间】:2016-11-03 16:02:34
【问题描述】:

我正在关注 this 教程,但 Symfony 似乎没有找到 MongoId 类。

{
    "message": "Attempted to load class \"MongoId\" from the global namespace.\nDid you forget a \"use\" statement?",
    "class": "Symfony\\Component\\Debug\\Exception\\ClassNotFoundException",
    "trace": [
      {
        "namespace": "",
        "short_class": "",
        "class": "",
        "type": "",
        "function": "",
        "file": "/home/local/BROCELIA/kha/dev/symfonyTraining/rest/vendor/doctrine/mongodb-odm/lib/Doctrine/ODM/MongoDB/Id/AutoGenerator.php",
        "line": 34,
        "args": []
      },
      ...
    ]
}

这是我的文件:

<?php

namespace Acme\StoreBundle\Document;
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;

/**
 * @MongoDB\Document
 */
class Product
{
/**
 * @MongoDB\Id
 */
protected $id;

/**
 * @MongoDB\Field(type="string")
 */
protected $name;

/**
 * @MongoDB\Field(type="float")
 */
protected $price;

public function getId() {
    return $this->id;
}

public function setName($name) {
    $this->name = $name;
    return $this;
}

public function getName() {
    return $this->name;
}

public function setPrice($price) {
    $this->price = $price;
    return $this;
}

public function getPrice() {
    return $this->price;
}
}

这是我的控制器:(注意:我正在使用 PhPStorm,它似乎也找不到 persist()flush() 方法。但不知道它是如何相关的)。

    <?php
    namespace Acme\StoreBundle\Controller;

    use Acme\StoreBundle\Document\Product;
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Symfony\Component\HttpFoundation\Response;

    class DefaultController extends Controller
    {
        public function indexAction()
        {
            return $this->render('AcmeStoreBundle:Default:index.html.twig');
        }


        public function createAction()
        {
            $product = new Product();
            $product->setName('A Foo Bar');
            $product->setPrice('19.99');
            $dm = $this->get('doctrine_mongodb')->getManager();
            $dm->persist($product);
            $dm->flush();
            return new Response('Created product id '.$product->getId());
        }
    }

我的 php 版本是 PHP 7.0.8-0ubuntu0.16.04.3 (cli) ( NTS )。我通过 pecl 安装了 php MongoDB 驱动程序。我还在我的 php.ini 末尾添加了extension=mongodb.so(我有两个:/etc/php/7.0/cli/php.ini/etc/php/7.0/fpm/php.ini,我都添加了它)。 php -r "phpinfo();" | grep "mongo" 输出:

mongodb
mongodb support => enabled
mongodb version => 1.1.9
mongodb stability => stable
libmongoc version => 1.3.6
mongodb.debug => no value => no value

所以我猜驱动程序已安装。虽然 php --ini; 的输出中没有 mongodb.ini(甚至 mongo.ini)这样的东西;

Configuration File (php.ini) Path: /etc/php/7.0/cli
Loaded Configuration File:         /etc/php/7.0/cli/php.ini
Scan for additional .ini files in: /etc/php/7.0/cli/conf.d
Additional .ini files parsed:      
/etc/php/7.0/cli/conf.d/10-mysqlnd.ini,
... Lots of .ini but nothing mongo-related.

4 小时,仍然不知道我在哪里搞砸了。我尝试并重新安装了 mongodb 驱动程序、php 和 pecl 几次,但都是徒劳的。 SO上要求这个的其他帖子似乎通过简单地重新安装驱动程序来解决他们的问题。可悲的是不是我的情况,而且我是 symfony 的新手。

【问题讨论】:

    标签: php mongodb symfony pecl


    【解决方案1】:

    将此添加到您的实体中。

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

    所以:

    namespace Acme\StoreBundle\Document;
    
    use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;
    use Doctrine\ODM\MongoDB\Mapping\Annotations\Id;
    
    /**
     * @MongoDB\Document
     */
    class Product
    {
       /**
        * @MongoDB\Id
        */
       protected $id;
    

    编辑

    这是您在应用中安装它的方式。

    Composer.json

    {
        "require": {
            "doctrine/mongodb-odm": "1.0.*@dev",
            "doctrine/mongodb-odm-bundle": "3.0.*@dev"
        },
    }
    

    作曲家更新

    php composer.phar update doctrine/mongodb-odm doctrine/mongodb-odm-bundle
    

    Autoload.php

    # app/autoload.php
    use Doctrine\ODM\MongoDB\Mapping\Driver\AnnotationDriver;
    AnnotationDriver::registerAnnotationClasses();
    

    AppKernel.php

    new Doctrine\Bundle\MongoDBBundle\DoctrineMongoDBBundle(),
    

    配置

    # app/config/config.yml
    doctrine_mongodb:
        connections:
            default:
                server:  mongodb://localhost:27017
                options: {}
    
        default_database: your_mongodb_database
        document_managers:
            default:
                auto_mapping:  true
                retry_connect: 3
                retry_query:   3
    

    确保您的 mongo 正在运行

    $ mongod
    

    Simple doctrine mongodb CRUD example in symfony 为例。

    【讨论】:

    • 仍然是相同的错误消息:/ - 用作MongoDB\Iduse Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB; 不应该实际上是同一件事吗?
    • 答案已更新。该博客有更多使用 symfony+mongo 的示例。
    • This 是我从 composer.phar 得到的输出。看起来它甚至没有看到 mongo php 扩展。您指定的所有其余内容都已经在我的代码中,而且 mongodb 正在运行,在良好的端口上。
    • 它们与您的操作系统环境有关,而不是与应用程序本身有关。
    • 我不明白的是为什么 composer 没有看到我的 mongodb 驱动程序已安装。
    【解决方案2】:

    在尝试运行 composer require doctrine/mongodb-odm doctrine/mongodb-odm-bundle 时,composer 很生气,告诉我我没有 mongodb 扩展。虽然我有它,但似乎学说/mongodb 需要ext-mongo 而不是mongodbext-mongo 仅适用于 php 版本 this package 可以做到这一点。

    【讨论】:

      猜你喜欢
      • 2017-04-24
      • 1970-01-01
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 2016-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多