Проблема с драйвером Symfony + MongoDB

Я следую этому уроку, но 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;
}
}

А вот мой контроллер: (NB: я использую 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 ), Я установил драйвер php MongoDB через pecl. Я также добавил extension=mongodb.so в конце моего php.ini (у меня было два из них: /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.

2 ответа

Решение

Пытаясь бежать composer require doctrine/mongodb-odm doctrine/mongodb-odm-bundle, композитор был в ярости, говоря мне, что у меня нет расширения mongodb. Хотя у меня это есть, похоже, что доктрина /mongodb требует ext-mongo и не mongodb, ext-mongo работает только для версий PHP <= 5.6. Похоже, что этот пакет может быть в состоянии добиться цели, хотя.

Добавьте это к вашей сущности.

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

Убедитесь, что ваш монго работает

$ mongod

Посмотрите на пример Simple doctrine mongodb CRUD в Symfony для примера.

Другие вопросы по тегам