1

我正在尝试使用带有参考的 Doctrine PHPCR DataFixtures 这里是一个示例。

<?php

namespace Example\Bundle\CMSBundle\DataFixtures\PHPCR;

use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;

use Example\Bundle\CMSBundle\Document\Theme;
use PHPCR\Util\NodeHelper;

class LoadThemeData extends AbstractFixture implements OrderedFixtureInterface
{
    /**
     * {@inheritDoc}
     */
    public function load(ObjectManager $dm)
    {
        NodeHelper::createPath($dm->getPhpcrSession(), '/cms/themes');
        $parent = $dm->find(null, '/cms/themes');

        $theme = new Theme();
        $theme->setTitle('Home');
        $theme->setPath('/');
        $theme->setParent($parent);

        $dm->persist($theme);
        $dm->flush();


        $this->setReference('theme-default', $theme);
    }

    /**
     * {@inheritDoc}
     */
    public function getOrder()
    {
        return 1; // the order in which fixtures will be loaded
    }
}

出现以下错误:

php app/console doctrine:phpcr:fixtures:load
Careful, database will be purged. Do you want to continue Y/N ?y
  > purging database
  > loading [1] Example\Bundle\CMSBundle\DataFixtures\PHPCR\LoadThemeData
PHP Fatal error:  Call to undefined method Doctrine\ODM\PHPCR\UnitOfWork::isInIdentityMap() in /Volumes/Project/CMS/vendor/doctrine/data-fixtures/lib/Doctrine/Common/DataFixtures/ReferenceRepository.php on line 97
PHP Stack trace:
PHP   1. {main}() /Volumes/Project/CMS/app/console:0
PHP   2. Symfony\Component\Console\Application->run() /Volumes/Project/CMS/app/console:26
PHP   3. Symfony\Bundle\FrameworkBundle\Console\Application->doRun() /Volumes/Project/CMS/vendor/symfony/symfony/src/Symfony/Component/Console/Application.php:121
PHP   4. Symfony\Component\Console\Application->doRun() /Volumes/Project/CMS/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Console/Application.php:96
PHP   5. Symfony\Component\Console\Application->doRunCommand() /Volumes/Project/CMS/vendor/symfony/symfony/src/Symfony/Component/Console/Application.php:191
PHP   6. Symfony\Component\Console\Command\Command->run() /Volumes/Project/CMS/vendor/symfony/symfony/src/Symfony/Component/Console/Application.php:904
PHP   7. Doctrine\Bundle\PHPCRBundle\Command\LoadFixtureCommand->execute() /Volumes/Project/CMS/vendor/symfony/symfony/src/Symfony/Component/Console/Command/Command.php:244
PHP   8. Doctrine\Common\DataFixtures\Executor\PHPCRExecutor->execute() /Volumes/Project/CMS/vendor/doctrine/phpcr-bundle/Doctrine/Bundle/PHPCRBundle/Command/LoadFixtureCommand.php:111
PHP   9. Doctrine\Common\DataFixtures\Executor\AbstractExecutor->load() /Volumes/Project/CMS/vendor/doctrine/data-fixtures/lib/Doctrine/Common/DataFixtures/Executor/PHPCRExecutor.php:65
PHP  10. Example\Bundle\CMSBundle\DataFixtures\PHPCR\LoadThemeData->load() /Volumes/Project/CMS/vendor/doctrine/data-fixtures/lib/Doctrine/Common/DataFixtures/Executor/AbstractExecutor.php:121
PHP  11. Doctrine\Common\DataFixtures\AbstractFixture->setReference() /Volumes/Project/CMS/src/Example/Bundle/CMSBundle/DataFixtures/PHPCR/LoadThemeData.php:31
PHP  12. Doctrine\Common\DataFixtures\ReferenceRepository->setReference() /Volumes/Project/CMS/vendor/doctrine/data-fixtures/lib/Doctrine/Common/DataFixtures/AbstractFixture.php:60

进一步研究这个问题,DoctrineFixturesBundle 用于 ODM 和 ORM。所以如果你同时查看 Doctrine\ODM\PHPCR\UnitOfWork 和 Doctrine\ODM\MongoDB\UnitOfWork,它们都有一个 $identityMap 变量。

Doctrine\ODM\PHPCR\UnitOfWork 缺少 isInIdentityMap 函数。

有什么建议么?接下来我该怎么做?

4

1 回答 1

0

我只想分享我对这个问题的解决方法。

  1. 我使用OrderedFixtureInterface界面来强制订购。
  2. find我用 的方法加载参考对象ObjectManager,例如: $home->setContent($dm->find(null, '/cms/pages/home'));

完整示例:

文件 1:

<?php
namespace Page\PortfolioBundle\DataFixtures\PHPCR;

use Page\PortfolioBundle\Document\Page;
use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;

class LoadPageData extends AbstractFixture implements OrderedFixtureInterface
{
    public function getOrder()
    {
        return 100;
    }
    public function load(ObjectManager $dm)
    {

        $root = $dm->find(null, '/cms/pages');

        $home = new Page();
        $home->setNodeName('home');
        $home->setParentDocument($root);
        $home->setTitle('Home');
        $home->setContent('Welcome to the homepage of this really basic CMS.');
        $dm->persist($home);
        $dm->flush();
    }
}

文件 2:

<?php
namespace Page\PortfolioBundle\DataFixtures\PHPCR;

use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Cmf\Bundle\MenuBundle\Doctrine\Phpcr\Menu;
use Symfony\Cmf\Bundle\MenuBundle\Doctrine\Phpcr\MenuNode;

class LoadMainMenuData extends AbstractFixture implements OrderedFixtureInterface
{
    public function getOrder()
    {
        return 500;
    }
    public function load(ObjectManager $dm)
    {
        $root = $dm->find(null, '/cms/menu');

        $menu = new Menu();
        $menu->setParentDocument($root);
        $menu->setName('main');
        $menu->setLabel('Main Menu');
        $dm->persist($menu);
        $dm->flush();

        $home = new MenuNode();
        $home->setParentDocument($menu);
        $home->setName('home');
        $home->setLabel('Home');
        $home->setLinkType('content');
        $home->setContent($dm->find(null, '/cms/pages/home'));
        $dm->persist($home);
        $dm->flush();
    }
}
于 2014-12-16T23:32:22.023 回答