10

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

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

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

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

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

所以没有额外的代理目录。但是当我刷新我认为有的网页时,它给了我以下错误:

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

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

@Bryan M.:这不是解决方案,而是解决方法。此外,它不起作用。在生成代理时,如果应用您的建议,它们将在 APPPATHSYSTEM 中生成,我的 webapp 将尝试从 APPPATHSYSTEM.“代理”加载它们。问题是,如果我使用,系统会在不同位置查找代理:

$config->setAutoGenerateProxyClasses(DEVELOPMENT);

如果 DEVELOPMENT 为真,它将查看 APPPATHSYSTEM。如果 DEVELOPMENT 设置为 false,它将查看 APPPATHSYSTEM."Proxies"。只是切换 DEVELOPMENT constance 会破坏我的应用程序,这在理论上是不可能的。

4

3 回答 3

5

我不认为 AutoGenerated 代理关心。

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

于 2010-11-04T18:01:05.350 回答
4

您是在 OS X 上开发并部署到 Linux 上吗?OS X 的文件系统不区分大小写。所以我经常会遇到一个问题,我错误地输入了一个类的大小写,它在本地环境中运行和传递得很好,但在我们的服务器上却卡住了。

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

于 2010-11-04T20:08:12.340 回答
3

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

路径是生成代理的目录的绝对路径。命名空间是必要的,以允许您配置自动加载器如何拾取这些实体。

您的情况下的路径必须类似于“代理/代理”,然后命名空间是“代理”。您的自动加载器必须配置为侦听目录“proxies/”中的命名空间前缀“Proxies”。

这就是 Doctrine 2 RC1 的全部情绪,我们找到了一种无需自动加载器帮助即可显式加载代理路径的方法,无需额外费用。因此,代理命名空间配置只需要确保没有其他类与代理位于同一命名空间中。

于 2010-11-16T13:12:15.277 回答