Честно говоря, вы не получите полного контроля над структурой проекта на symfony, прочитав этот пост. На его написание меня подтолкнула ситуация на работе. Клиент поставил условие, что по завершению разработки проект должен быть развернут на его хостинге. Все бы ничего, но вот ftp заказчик согласился дать лишь к document root‘у сайта, а также к еще одной папке, находящейся на одном уровне с ним. Естественно, в таком случае, развернуть проект на symfony без танцев с бубном вряд ли получится. Долго я серфил инет в поисках решения, но так и не нашел его.
Задача
Нужно разместить проект в двух папках на одном уровне (хотя их положение относительно друг друга неважно), причем одна из папок – это document root сайта.
Смешно, но решение оказалось очень простым.
<?php
/*
Файл /config/ProjectConfiguration.class.php
должен выглядеть приблизительно так.
*/
require_once dirname(__FILE__).'/../lib/symfony/autoload/sfCoreAutoload.class.php';
sfCoreAutoload::register();
class ProjectConfiguration extends sfProjectConfiguration {
...
Естественно, для такого проекта можно использовать как standalone библиотеки, так и отдельно установленные через PEAR. Просто нужно указать правильный относительный путь к автолоадеру ядра.
Следующим шагом будет исправление входных точек приложений в папке /web. Рассмотрим пример с index.php.
<?php
// Исходный файл /web/index.php
require_once(dirname(__FILE__).'/../config/ProjectConfiguration.class.php');
$configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'prod', false);
sfContext::createInstance($configuration)->dispatch();
Нам нужно указать путь к конфигурационному файлу в строке 8, учитывая, что все папки проекта, кроме /web, будут находятся во второй директории, к которой у нас есть ftp-доступ.
Получаем приблизительно следующее
<?php
// Файл /web/index.php
require_once(dirname(__FILE__).'/../data/config/ProjectConfiguration.class.php');
$configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'prod', false);
sfContext::createInstance($configuration)->dispatch();
В данном примере вспомогательным каталогом является каталог data.
Таким же образом меняем другие входные точки, вроде frontend_dev.php, backend.php, backend_dev.php.
Остается только раскидать проект по папкам. Всё, кроме папки /web, перемещаем в папку data. А содержимое папки /web кидаем в наш document root.
В принципе, это все. Можно по аналогии поменять файл symfony, по которому мы выполняем таски. Не факт, что все будет работать правильно. Например, plugin:publish-assets точно не будет. Но я не думаю, что на продакшене понадобится выполнение тасков, работающих с папкой /web.
UPD: для того чтобы заработали таски работающие с папкой /web, нужно поправить конфигурацию проекта.
// config/ProjectConfiguration.class.php
class ProjectConfiguration extends sfProjectConfiguration
{
public function setup()
{
$this->setWebDir($this->getRootDir().'/../web');
}
}
Спасибо Евгению и документации по symfony за упоминание об этом методе.


Комментариев - 10
еще советую обратить внимание на метод $this->setWebDir($this->getRootDir() . ‘/..’);
класса sfProjectConfiguration.
мне он помог в еще более ужасной ситуации: у меня был только httpdocs. в httpdocs у меня служила как web папка, в ней же лежал основной код проекта. Основной код проекта пришлось закрывать htaccess’ом. Евгений(Quote)
Евгений, а можно примерчик закрытия основного кода htaccess’ом? Ник(Quote)
эмм. Все просто:
order allow,deny
deny from all Евгений(Quote)
Не совсем ясно…
Как я понял, у вас в htdocs лежал весь проект + содержимое web. Или как? catch(Quote)
да, именно так. возможности положить сам проект куда-нибудь выше хтдоксов не было, поэтому все лежало в одной папке htdocs Евгений(Quote)
мм… все догнал.
Но права
order allow,deny
deny from all
надо будет либо ставить в одном .htaccess’е в htdocs на каждую директорию.
Например
<Directory /apps>
order allow,deny
deny from all
</Directory>
Либо раскидывать несколько .htaccess’ов c
order allow,deny
deny from all
по папкам проекта catch(Quote)
Полезный пост, занес в закладки. nakham(Quote)
хтаксесс с кодом, который я привел, находится в папке с проектом и он действует на все подпапки и файлы этого каталога. Евгений(Quote)
я с этих слов решил, что у вас в htdocs лежали папки app, config, lib, test и т.д. Это меня и смутило, потому что .htaccess в таком случае закрыл бы доступ и к index.php, и к ему подобным.
Я так понимаю, что я не правильно вас понял. Видимо в htdocs у вас лежит папка-контейнер проекта, а в ней уже .htaccess.
Столько размусоливания из-за пустяка =)
catch(Quote)
Так не люблю читать чужой код.. Чёрный список работодателей Казахстана!(Quote)
Добавьте свой комментарий!