Doctrine 2. 自动生成代理

Posted

技术标签:

【中文标题】Doctrine 2. 自动生成代理【英文标题】:Doctrine 2. Auto generating proxies 【发布时间】:2010-11-04 11:12:38 【问题描述】:

我有一个奇怪的问题。我想在 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

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

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 常量会破坏我的应用程序,这在理论上是不可能的。

【问题讨论】:

尝试将代理目录设置为仅 APPPATHSYSTEM。它应该从那里获取“代理”命名空间。 【参考方案1】:

我认为自动生成的代理不在乎。

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

【讨论】:

【参考方案2】:

您是在 OS X 上开发并部署到 Linux 上吗? OS X 的文件系统是不区分大小写的。所以我经常会遇到一个问题,我错误地键入了一个类的大小写,它在本地环境中运行并通过,但在我们的服务器上阻塞。

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

【讨论】:

【参考方案3】:

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

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

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

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

【讨论】:

我知道命名空间和路径之间的区别:)。再次阅读我的帖子以了解真正的问题。不过感谢您的反应。

以上是关于Doctrine 2. 自动生成代理的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2,Doctrine,延迟加载和代理类问题

Symfony 5(Doctrine 2.9),Doctrine 不会为 ManyToOne 自引用关系生成迁移

Zend 2 Framework - Doctrine从给定的2个实体生成表

Doctrine 2 查询生成器 abs 函数

Doctrine 2 中的代理是啥?

Doctrine 2 - 使用数据库中的视图生成实体