Проблема с драйвером 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 для примера.