Доктрина 2. Авто генерация прокси - PullRequest
10 голосов
/ 04 ноября 2010

У меня странная проблема. Я хочу отключить автоматическую генерацию моих прокси в Doctrine 2. Я нашел эту строку кода, которая должна (и выполняет) хитрость:

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

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

В моей тестовой среде прокси расположены по адресу application / proxies . i.e.:

application/proxies/BaseUserProxy.php

Когда я нахожусь в живом окружении, мой код внезапно ищет прокси в application / proxies / Proxies , который не является фактическим местоположением.

Я понимаю, что это как-то связано с пространством имен, но я не понимаю, почему он ведет себя по-разному при использовании метода setAutoGenerateProxy .

Есть идеи?

1020 * редактировать *

Я сгенерировал новые прокси, используя:

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. Кто-нибудь?

@ Брайан М. : Это не решение, а обходной путь. Кроме того, это не работает. При создании прокси-серверов они, при применении вашего предложения, будут генерироваться в APPPATHSYSTEM, и мое веб-приложение попытается загрузить их из APPPATHSYSTEM. «Прокси-серверы». Проблема в том, что система ищет прокси в разных местах, если я использую:

$config->setAutoGenerateProxyClasses(DEVELOPMENT);

Если DEVELOPMENT имеет значение true, он будет смотреть на APPPATHSYSTEM. Если для DEVELOPMENT задано значение false, он будет смотреть на APPPATHSYSTEM. «Прокси». Простое переключение константы РАЗВИТИЯ разрушает мое приложение, что теоретически не должно быть возможным.

Ответы [ 3 ]

4 голосов
/ 04 ноября 2010

Вы разрабатываете на OS X и развертываете на Linux?Файловая система OS X не чувствительна к регистру .Поэтому я часто сталкиваюсь с проблемой, когда неправильно набираю регистр для класса, и он работает и проходит нормально в локальной среде, но задыхается на нашем сервере.

Так что в этом случае в OS Xпространство имен «Прокси» может преобразовываться в «/ прокси», но в производственной среде не может найти папку класса и создает ее в «/proxies/Proxies".

».
3 голосов
/ 16 ноября 2010

Если вы переименуете папку в нечто, называемое «/ temp», вы поймете разницу между путем и пространством имен.

Путь - это абсолютный путь к каталогу, в который создаются прокси. Пространство имен необходимо, чтобы вы могли настроить способ загрузки этих объектов автозагрузчиком.

Путь в вашем случае должен быть чем-то вроде «прокси / Прокси», а пространство имен тогда будет «Прокси». Ваш автозагрузчик должен быть настроен на прослушивание префикса пространства имен «Прокси» в каталоге «прокси /".

»

Это все настроение с Doctrine 2 RC1, хотя мы нашли способ явно загрузить путь прокси без помощи автозагрузчика без дополнительных затрат. Поэтому конфигурирование пространства имен прокси необходимо только для того, чтобы другие классы не находились в том же пространстве имен, что и прокси.

3 голосов
/ 04 ноября 2010

Я не думаю, что AutoGenerated прокси-серверы заботятся.

Вместо того, чтобы запускать автоматически сгенерированные прокси-серверы в производство, вы, вероятно, должны doctrine orm:generate-proxies, что, как я подозреваю, поместит их в то место, где ваш производственный код настроен для поискаим.

...