Как переопределить стуктуру каталогов Symfony по умолчанию

Symfony автоматически поставляется со структурой каталогов по умолчанию, но вы можете с лёгкостью переопределить этоу структуру каталогов, чтобы создать собственную:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
your-project/
├─ assets/
├─ bin/
│  └─ console
├─ config/
├─ public/
│  └─ index.php
├─ src/
│  └─ ...
├─ templates/
├─ tests/
├─ translations/
├─ var/
│  ├─ cache/
│  ├─ log/
│  └─ ...
├─ vendor/
└─ .env

Переопределите каталог файлов окружения (DotEnv)

По умолчанию, файл конфигурации .env находится в корневом каталоге проекта. Если вы храните его в другом месте, определите опцию runtime.dotenv_path в файле composer.json:

1
2
3
4
5
6
7
8
9
{
    "...": "...",
    "extra": {
        "...": "...",
        "runtime": {
            "dotenv_path": "my/custom/path/to/.env"
        }
    }
}

Затем, обновите ваши файлы Composer (выполнив composer update, к примеру), чтобы файлы vendor/autoload_runtime.php были повторно сгенерированы с новым путем .env.

Вы также можете настроить разные пути .env для ваших вызовов консоли и веб-сервера. Отредактируйте файлы public/index.php и/или bin/console, чтобы определить новый путь файла.

Скрипт консоли:

// bin/console

// ...
$_SERVER['APP_RUNTIME_OPTIONS']['dotenv_path'] = 'some/custom/path/to/.env';

require_once dirname(__DIR__).'/vendor/autoload_runtime.php';
// ...

Веб фронт-контроллер:

// public/index.php

// ...
$_SERVER['APP_RUNTIME_OPTIONS']['dotenv_path'] = 'another/custom/path/to/.env';

require_once dirname(__DIR__).'/vendor/autoload_runtime.php';
// ...

Переопределите каталог конфигурации

Каталог конфигурациия - единственный не подддается переопределению в приложении Symfony. Его местоположение жестко закодировано в виде каталога config/ в корневом каталоге кашего приложения.

Переопределите каталог кеша

Вы можете изменить каталог кеша по умолчанию, переопределив метод getCacheDir() в классе Kernel вашего приложения:

// src/Kernel.php

// ...
class Kernel extends BaseKernel
{
    // ...

    public function getCacheDir()
    {
        return dirname(__DIR__).'/var/'.$this->environment.'/cache';
    }
}

В этом коде, $this->environment - это текущее окружение (т.е. dev). В этом случае, вы изменили локацию каталога кеша на var/{environment}/cache.

Вы также можете изменить каталог кеша, определяющего переменную окружения под названием``APP_CACHE_DIR``, чье значение является полным путем папки кеша.

Caution

Вам стоит оставить каталог cache разным для каждого окружения, иначе может произойти непредвиденное поведение приложения. Каждое окружение генерирует свои собственный кешированные файлы конфигурации, поэтому каждый требует своего собственного каталога для хранения этих кешированных файлов.

Переопределите каталог логов

Переопределение каталога var/log/ почти то же самое, что и переопределение каталога var/cache/.

Вы можете сделать это, переопределив метод getLogDir() в классе Kernel вашего приложения:

// src/Kernel.php

// ...
class Kernel extends BaseKernel
{
    // ...

    public function getLogDir()
    {
        return dirname(__DIR__).'/var/'.$this->environment.'/log';
    }
}

Здесь вы изменили локацию каталога на var/{environment}/log/.

Вы также можете изменить каталог логов, определяющий переменную окружения под названием APP_LOG_DIR, чье значение является полным путем папки логов.

Переопределите каталог шаблонов

Если ваши щаблоны не хранятся в каталоге по умолчанию templates/, используйте опцию конфигурации twig.default_path, чтобы определить ваш собственный каталог шаблонов (используйте twig.paths для нескольких каталогов):

  • YAML
    1
    2
    3
    4
    # config/packages/twig.yaml
    twig:
        # ...
        default_path: "%kernel.project_dir%/resources/views"
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    <!-- config/packages/twig.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:twig="http://symfony.com/schema/dic/twig"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            https://symfony.com/schema/dic/services/services-1.0.xsd
            http://symfony.com/schema/dic/twig
            https://symfony.com/schema/dic/twig/twig-1.0.xsd">
    
        <twig:config>
            <twig:default-path>%kernel.project_dir%/resources/views</twig:default-path>
        </twig:config>
    
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    6
    // config/packages/twig.php
    use Symfony\Config\TwigConfig;
    
    return static function (TwigConfig $twig) {
        $twig->defaultPath('%kernel.project_dir%/resources/views');
    };
    

Переопределите каталог переводов

Если ваши файлы перевод не хранятся в каталоге по умолчанию translations/, используйте опцию настройки framework.translator.default_path, чтобы определить ваш собственный каталог переводов (используйте framework.translator.paths для нескольких каталогов):

  • YAML
    1
    2
    3
    4
    5
    # config/packages/translation.yaml
    framework:
        translator:
            # ...
            default_path: "%kernel.project_dir%/i18n"
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    <!-- config/packages/translation.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:twig="http://symfony.com/schema/dic/twig"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            https://symfony.com/schema/dic/services/services-1.0.xsd
            http://symfony.com/schema/dic/twig
            https://symfony.com/schema/dic/twig/twig-1.0.xsd">
    
        <framework:config>
            <framework:translator>
                <framework:default-path>%kernel.project_dir%/i18n</framework:default-path>
            </framework:translator>
        </framework:config>
    
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    6
    7
    8
    // config/packages/translation.php
    use Symfony\Config\FrameworkConfig;
    
    return static function (FrameworkConfig $framework) {
        $framework->translator()
            ->defaultPath('%kernel.project_dir%/i18n')
        ;
    };
    

Переопределите публичный каталог

Если вам нужно переименовать или переместить ваш каталог public/, то единственное, что вам нужно гарантировать - чтобы путь к каталогу vendor/ был всё ещё правильным в вашем фронт-контроллере index.php . Если вы просто переименовали каталог, то всё в порядке. Но если вы переместили его куда-либо, то вам нужно будет изменить эти пути внутри этих файлов:

require_once __DIR__.'/../path/to/vendor/autoload.php';

Вам также нужно изменить опцию extra.public-dir в файле composer.json:

1
2
3
4
5
6
7
{
    "...": "...",
    "extra": {
        "...": "...",
        "public-dir": "my_new_public_dir"
    }
}

Tip

Некоторые общие хосты имеют корневой веб-каталог public_html/. Переименование вашего веб-каталога с public/ на public_html/ - это один из способов заставить ваш проект Symfony работать на общем хосте. Другой способ - развернуть ваше приложение в каталоге вне вашего веб-корня, удалите ваш каталог public_html/, а потом замените его символической ссылкой на public/ в вашем проекте.

Переопределите каталог поставщиков

Чтобы переопределить каталог``vendor/, вам нужно определить опцию ``vendor-dir в вашем файле composer.json следующим образом:

1
2
3
4
5
6
{
    "config": {
        "bin-dir": "bin",
        "vendor-dir": "/some/dir/vendor"
    }
}

Tip

Это изменение может пригодиться, если вы работаете в виртуальном окружении и не можете использовать NFS. Например, если вы запускаете приложение Symfony, используя Vagrant/VirtualBox в гостевой ОС.

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.