原则2返回错误“代理目录必须可写”

use*_*187 3 doctrine-orm zend-framework2

我正在使用Zendframework 2的教义2

我试图返回一个对象,但不断收到此错误:

您的代理目录必须可写

这是我的查询:

$this->getEntityManager()
                    ->getRepository('Messages\Entity\Messages')
                    ->findOneBy(array('id' => 6,
                                      'receiverId' => 16
                   ));
Run Code Online (Sandbox Code Playgroud)

但是,同一查询返回的数组没有任何问题,重新:

$qb = $this->getEntityManager()->createQueryBuilder();

     $qb->select(array('u'))
        ->from('Messages\Entity\Messages','u')
        ->where('u.id = :id')  
        ->andWhere('u.receiverUserId = :receiverId')    
        ->setParameter('receiverId',16)    
        ->setParameter('id',(int)6);

      $query = $qb->getQuery();
        return   $data = $query->getArrayResult(); 
Run Code Online (Sandbox Code Playgroud)

Emm*_*ohn 5

如果您使用的是Setup::createAnnotationMetadataConfiguration,只需通过以下方法进行修复

  1. 在项目根目录中创建以下目录。 data/DoctrineORMModule/Proxy
  2. chmod -R 755 data/DoctrineORMModule/Proxy

在您的引导程序中,包括数据目录的路径,如下所示:

Setup::createAnnotationMetadataConfiguration(array(__DIR__ . "/src/models"), $this->isDevMode, "data/DoctrineORMModule/Proxy")

这为我解决了。


edi*_*igu 2

代理是简单的类,它扩展了您的实际实体,并由学说在内部使用,通过延迟加载实体来水合实体的关联。Doctrine 决定在不同情况下在运行时使用或不使用代理实例,这实际上取决于您的实体中的查询和关联。您可能想在官方文档中深入了解这个主题。

在您的情况下,学说试图为您的Messages实体生成代理类,但您的代理目录根本不可写,如错误输出所述。

这似乎是DoctineModule 的配置错误。(假设您正在使用DoctrineORMModule将 Doctrine 与 ZF2 集成)Doctrine 需要一个可写目录来放置生成的代理类。在ZF2看来,data应用程序根目录下的目录完全符合这个要求。

  1. 确保您的中存在以下行public/index.php:

    chdir(dirname(__DIR__));
    
    Run Code Online (Sandbox Code Playgroud)
  2. 并尝试使用这样的配置:

    <?php
    /**
     * module/Application/config/module.config.php
     */
    return array(
        'router' => array(
             // ...
        ),
    
        // ...
    
        'doctrine' => array(
            'driver' => array(
               //...
            ),
    
            /**
             * Generating proxies on runtime and using array cache instead of apc(u)
             * greatly reduces the performance. So, you may want to override 
             * this settings on production environment.
             */
            'configuration' => array(
                'orm_default' => array(
                    'metadata_cache' => 'array',
                    'query_cache' => 'array',
                    'result_cache' => 'array',
                    'hydration_cache' => 'array',
                    'generate_proxies' => true,
                    'proxy_dir' => 'data/DoctrineORMModule/Proxy',
                    'proxy_namespace' => 'DoctrineORMModule\Proxy',
                ),
            ),
         )
     );
    
    Run Code Online (Sandbox Code Playgroud)