Doctrine 2.自动生成代理

时间:2010-11-04 11:12:38

标签: php orm doctrine-orm

我有一个奇怪的问题。我想在Doctrine 2中关闭代理的自动生成。我发现这行代码应该做(并且确实)这个技巧:

$config->setProxyDir(APPPATHSYSTEM."/proxies");
$config->setProxyNamespace('Proxies');

// Auto generate proxies for development
$config->setAutoGenerateProxyClasses(DEVELOPMENT);

在我的测试环境中,代理位于 application / proxies 。即:

application/proxies/BaseUserProxy.php

当我在实时环境中时,我的代码突然在 application / proxies / Proxies 中搜索代理,这不是实际位置。

我知道它与命名空间有关,但我不明白为什么在使用 setAutoGenerateProxy 方法时它的行为会有所不同。

有什么想法吗?

修改

我确实使用:

生成了新的代理
orm:generate-proxies

选项。

这给了我这个输出:

php doctrine.php orm:generate-proxies
Processing entity "Base\Element"
Processing entity "Base\Page"
...
Processing entity "Base\Site"

Proxy classes generated to "/var/www/application/proxies"

查看最后一行,代理在/ var / www / application / proxies中生成。目录列表如下所示:

BaseElementProxy.php
BasePageProxy.php
...
BaseSiteProxy.php

因此没有额外的Proxies目录。但是,当我刷新我认为有的网页时,它会给我以下错误:

Warning: require(/var/www/application//proxies/Proxies/BaseUserProxy.php) 
[function.require]: failed to open stream: 
No such file or directory in /var/www/library/Doctrine/Common/ClassLoader.php on line 148

为什么要添加额外的Proxies目录?如果我确实在每个请求上生成代理,则它不会在额外的Proxies目录中查找。任何人

@Bryan M。:这不是一个解决方案,而是一种解决方法。此外,它不起作用。在生成代理时,如果应用您的建议,它们将在APPPATHSYSTEM中生成,我的webapp将尝试从APPPATHSYSTEM加载它们。“Proxies”。问题是如果我使用:

,系统会在不同的位置查找代理
$config->setAutoGenerateProxyClasses(DEVELOPMENT);

如果开发成立,则会查看APPPATHSYSTEM。如果DEVELOPMENT设置为false,它将查看APPPATHSYSTEM。“Proxies”。只是切换开发常量会破坏我的应用程序,理论上应该是不可能的。

3 个答案:

答案 0 :(得分:4)

您是在开发OS X并部署到Linux吗? OS X的文件系统是不敏感的。所以我经常会遇到一个问题,我错误地输入了一个类的情况,它在本地环境中运行并传递得很好,但在我们的服务器上发生了阻塞。

所以在这种情况下,在OS X中,命名空间“Proxies”能够解析为“/ proxies”,但在生产中,它无法找到类文件夹,并在“/ proxies / Proxies”下创建它

答案 1 :(得分:3)

我认为AutoGenerated代理不关心。

不应该将自动生成的代理推送到生产环境,而应该doctrine orm:generate-proxies,我怀疑它会将它们放在您的生产代码配置为查找它们的位置。

答案 2 :(得分:3)

如果将文件夹重命名为“/ temp”,您将意识到路径和命名空间之间的区别。

路径是代理生成的目录的绝对路径。必须使用命名空间来配置自动加载器如何获取这些实体。

您的案例中的路径必须类似于“代理/代理”,然后命名空间为“代理”。您的自动装带器必须配置为在目录“proxies /".

中侦听名称空间前缀”Proxies“

虽然这是使用Doctrine 2 RC1的所有情绪,但我们找到了一种无需额外费用即可在没有自动加载器帮助的情况下显式加载代理路径的方法。因此,只需要确保没有其他类与代理在同一名称空间中,因此只需要Proxy Namespace configuratino。