У меня действительно очень странный баг.
У меня есть два vhosts на одной машине: staging и production.
Они расположены в /var/www/staging/ и /var/www/production/. Я развертываю свой проект Symfony2 через Capifony (расширение capistrano для symfony2), поэтому веб-каталог находится в /var/www/staging/current/web/
Когда я echo __DIR__
в своем контроллере получаю
/var/www/production/releases/20130424075147/src/Acme/DemoBundle/Controller
Что правильно. Однако, если я сейчас получу объект из своего репозитория (например)
$object = $this->getDoctrine()->getManager()->getRepository('AcmeDemoBundle:Object')->findOneById(1);
И сделайте echo $object->getUploadRootDir()
(из книги рецептов), в котором используется __DIR__
Я внезапно получаю
/var/www/staging/releases/20130424075333/src/Acme/DemoBundle/Entity/../../../../web/upload/
Каким-то образом при загрузке объекта он переключился на промежуточную среду вместо производственной (две разные папки выпуска просто потому, что между производственной и промежуточной версиями есть разные выпуски).
Это из-за автозагрузки? Ошибка конфигурации в vhosts?
Ниже приведены мои два vhosts
<VirtualHost *:80>
DocumentRoot "/var/www/production/current/web"
ServerName example.com
ServerAlias www.example.com example.com
SetEnv SYMFONY_ENV prod
SetEnv SYMFONY_DEBUG 0
<Directory /var/www/production/current/web>
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ app.php [QSA,L]
</Directory>
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "/var/www/staging/current/web"
ServerName staging.example.com
ServerAlias staging.example.com
SetEnv SYMFONY_ENV dev
SetEnv SYMFONY_DEBUG 1
<Directory /var/www/staging/current/web>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ app.php [QSA,L]
</Directory>
</VirtualHost>