10

奇妙な問題があります。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);

DEVELOPMENT が true の場合、APPPATHSYSTEM が参照されます。DEVELOPMENT が false に設定されている場合、APPPATHSYSTEM."Proxies" が参照されます。DEVELOPMENT コンスタンスを切り替えるだけでアプリケーションが壊れます。理論的には不可能です。

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」の下に作成されます。

于 2010-11-04T20:08:12.340 に答える
3

フォルダーの名前を "/temp" という名前に変更すると、パスと名前空間の違いがわかります。

パスは、プロキシが生成されるディレクトリへの絶対パスです。名前空間は、オートローダーがこれらのエンティティを取得する方法を構成できるようにするために必要です。

あなたの場合のパスは「プロキシ/プロキシ」のようなものでなければならず、名前空間は「プロキシ」です。オートローダーは、ディレクトリ「proxyes/」でネームスペース プレフィックス「Proxies」をリッスンするように設定する必要があります。

これは Doctrine 2 RC1 の雰囲気ですが、オートローダーの助けを借りずにプロキシ パスを追加コストなしで明示的にロードする方法を見つけました。したがって、プロキシ名前空間構成は、他のクラスがプロキシと同じ名前空間にないことを確認するためにのみ必要です。

于 2010-11-16T13:12:15.277 に答える