doctrine 2返回错误'代理目录必须是可写的'

时间:2014-05-01 10:52:22

标签: doctrine-orm zend-framework2

我正在使用Zendframework 2的学说2

我正在尝试返回一个对象,但一直收到此错误:

  

您的代理目录必须是可写的

这是我的疑问:

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

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

$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(); 

3 个答案:

答案 0 :(得分:4)

如果您使用的是Setup::createAnnotationMetadataConfiguration,则可以通过

进行修复
  1. 在项目根目录中创建以下目录。 data/DoctrineORMModule/Proxy
  2. chmod -R 755 data/DoctrineORMModule/Proxy
  3. 在您的引导程序中包括数据目录的路径,如:

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

    为我修好了。

答案 1 :(得分:2)

代理是简单的类,它扩展了您的实际实体,并由doctrine内部使用,以通过lazy-loading来实现实体的关联。 Doctrine决定在运行时使用或不使用代理实例用于不同的情况,它实际上取决于您的实体中的查询和关联。您可能希望在official documentation深入了解此主题。

在您的情况下,学习尝试为您的Messages实体生成代理类,但您的代理目录根本不可写,因为错误输出表示。

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

  1. 确保public/index.php

    中存在以下行
    chdir(dirname(__DIR__));
    
  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',
                ),
            ),
         )
     );
    

答案 2 :(得分:0)

如果您使用的是Fedora 24,请输入以下命令:

semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/YOUR_SITE/data';
restorecon -v '/var/www/html/YOUR_SITE/data'

有了这个,您正在更改/var/www/html的标签并向httpd提供写入权限。