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

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

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

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// src/Kernel.php

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

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

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

Caution

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

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

Переопределеие каталога logs такое же, как и переопределение каталога cache. Единственная разница в том, что вам нужно переопределить метод getLogDir():

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// src/Kernel.php

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

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

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

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

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

  • YAML
    1
    2
    3
    4
    # config/packages/twig.yaml
    twig:
        # ...
        paths: ["%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" ?>
    <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
            http://symfony.com/schema/dic/services/services-1.0.xsd
            http://symfony.com/schema/dic/twig
            http://symfony.com/schema/dic/twig/twig-1.0.xsd">
    
        <twig:config>
            <twig:path>%kernel.project_dir%/resources/views</twig:path>
        </twig:config>
    
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    6
    // config/packages/twig.php
    $container->loadFromExtension('twig', array(
        'paths' => array(
            '%kernel.project_dir%/resources/views',
        ),
    ));
    

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

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

  • YAML
    1
    2
    3
    4
    5
    # config/packages/translation.yaml
    framework:
        translator:
            # ...
            paths: ["%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" ?>
    <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
            http://symfony.com/schema/dic/services/services-1.0.xsd
            http://symfony.com/schema/dic/twig
            http://symfony.com/schema/dic/twig/twig-1.0.xsd">
    
        <framework:config>
            <framework:translator>
                <framework:path>%kernel.project_dir%/i18n</framework:path>
            </framework:translator>
        </framework:config>
    
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    6
    7
    8
    // config/packages/translation.php
    $container->loadFromExtension('framework', array(
        'translator' => array(
            'paths' => array(
                '%kernel.project_dir%/i18n',
            ),
        ),
    ));
    

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

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

1
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, а потом замените его символической ссылкой на web в вашем проекте.

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

Чтобы переопределить каталог``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.