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

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
your-project/
├─ app/
│  ├─ config/
│  ├─ Resources/
│  │  └─ views/
│  └─ ...
├─ bin/
│  └─ ...
├─ src/
│  └─ ...
├─ tests/
│  └─ ...
├─ var/
│  ├─ cache/
│  ├─ logs/
│  └─ ...
├─ vendor/
│  └─ ...
└─ web/
   ├─ app.php
   └─ ...

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// app/AppKernel.php

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

    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
// app/AppKernel.php

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

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

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

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

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

  • YAML
    1
    2
    3
    4
    # app/config/config.yml
    twig:
        # ...
        paths: ["%kernel.root_dir%/../templates"]
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    <!-- app/config/config.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.root_dir%/../templates</twig:path>
        </twig:config>
    
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    6
    // app/config/config.php
    $container->loadFromExtension('twig', array(
        'paths' => array(
            '%kernel.root_dir%/../templates',
        ),
    ));
    

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

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

1
require_once __DIR__.'/../path/to/app/autoload.php';

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

1
2
3
4
5
6
7
{
    "...": "...",
    "extra": {
        "...": "...",
        "symfony-web-dir": "my_new_web_dir"
    }
}

Tip

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

Note

Если вы используете AsseticBundle, вам нужно сконфигурировать опцию read_from, чтобы указать на правильный каталог web:

  • YAML
    1
    2
    3
    4
    5
    6
    # app/config/config.yml
    
    # ...
    assetic:
        # ...
        read_from: '%kernel.project_dir%/../public_html'
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    <!-- app/config/config.xml -->
    <?xml version="1.0" encoding="UTF-8"?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:assetic="http://symfony.com/schema/dic/assetic"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd
            http://symfony.com/schema/dic/assetic
            http://symfony.com/schema/dic/assetic/assetic-1.0.xsd">
    
        <!-- ... -->
        <assetic:config read-from="%kernel.root_dir%/../../public_html" />
    
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    6
    7
    // app/config/config.php
    
    // ...
    $container->loadFromExtension('assetic', array(
        // ...
        'read_from' => '%kernel.project_dir%/../public_html',
    ));
    

Теперь вам просто нужно очистить кеш, снова сбросить ресурсы и ваше приложение должно работать:

1
2
$ php bin/console cache:clear --no-warmup --env=prod
$ php bin/console assetic:dump --env=prod --no-debug

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

Чтобы переопределить каталог``vendor``, вам нужно внести изменения в файлы app/autoload.php и composer.json.

Изменение в composer.json будет выглядеть так:

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

Далее, обновите путь к файлу autoload.php в app/autoload.php:

1
2
3
4
// app/autoload.php

// ...
$loader = require '/some/dir/vendor/autoload.php';

Tip

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

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