Como obter o diretório raiz do aplicativo Symfony2?

121

Qual é a melhor maneira de obter o diretório de aplicativos raiz de dentro do controlador? É possível tirá-lo do controle?

Agora eu entendi passando-o (dos parâmetros) para o serviço como argumento, assim:

services:

    sr_processor:
        class: Pro\Processor
        arguments: [%kernel.root_dir%]

Existe uma maneira melhor e mais simples de obter essas informações no Symfony2?

Dawid Ohia
fonte
13
sua solução é melhor
Inoryy
4
você está misturando-se um serviço e um yo controlador
John Smith
4
Novamente, para o Symfony 3.3, use em diante %kernel.project_dir%para obter a raiz do seu projeto.
Muzafar Ali
1
certifique-se de encapsular literais entre aspas: ["%kernel.root_dir%"]
ochitos

Respostas:

220

UPDATE 2018-10-21:

A partir desta semana, getRootDir()foi preterido. Em getProjectDir()vez disso, use como sugerido na seção de comentários de Muzaraf Ali.

—-

Usa isto:

$this->get('kernel')->getRootDir();

E se você quiser a raiz da web :

$this->get('kernel')->getRootDir() . '/../web' . $this->getRequest()->getBasePath();

isso funcionará a partir do método de ação do controlador ...

EDIT: Quanto aos serviços, acho que da maneira que você fez, o mais limpo possível, embora eu passasse o serviço completo do kernel como argumento ... mas isso também fará o truque ...

Jovan Perovic
fonte
3
+1, mas não é preciso para o symfony2. Em vez disso, use:$this->get('kernel')->getRootDir() . '/../..' . $this->getRequest()->getBasePath();
Sebastian
36
Esta solução é adequada apenas para controladores. Aqui a questão é sobre serviços. Enfim, por que passar o contêiner inteiro apenas para obter uma variável? É muito melhor passar apenas% kernel.root_dir% #
Massimiliano Arione 10/10
2
Massimiliano é certo, e como um complemento, eu uso $this->container->getParameter('kernel.cache_dir')em controladores em vez da solução que você forneceu
lackovic10
2
Isso foi mais sobre o tópico de seu serviço ter containerinjetado :) Se você seguir as práticas recomendadas, a injeção containerdeve ser evitada a todo custo. Quanto à solução de conseguir webdiretório, eu ainda uso o que eu forneci acima;)
Jovan Perovic
4
Como Symfony de 3,3 e em diante usar %kernel.project_dir%/web/em vez de%kernel.root_dir%/../web/
Muzafar Ali
15

No Symfony 3.3 você pode usar

$projectRoot = $this->get('kernel')->getProjectDir();

para obter a raiz da web / projeto.

Chris
fonte
8

Se você estiver usando esse caminho para acessar partes dos projetos que não são código (por exemplo, um diretório de upload ou um banco de dados SQLite), talvez seja melhor transformar o caminho em um parâmetro, como este:

parameters:
    database_path: '%kernel.root_dir%/../var/sqlite3.db'

Esse parâmetro pode ser injetado em qualquer lugar que você precisar, para que você não precise mais mexer nos caminhos do seu código. Além disso, o parâmetro pode ser substituído no momento da implantação. Finalmente, todo programador de manutenção terá uma idéia melhor para o que você o está usando.

Atualização: Corrigido o uso constante do kernel.root_dir.

MauganRa
fonte
6

Você também pode usar a expressão regular além disso:

    $directoryPath = $this->container->getParameter('kernel.root_dir') . '/../web/bundles/yourbundle/';
    $directoryPath = preg_replace("/app..../i", "", $directoryPath);
    echo $directoryPath;
Tragaknight
fonte
2

Desde o Symfony 3.3, você pode usar encadernação, como

services:
_defaults:
    autowire: true      
    autoconfigure: true
    bind:
        $kernelProjectDir: '%kernel.project_dir%'

Depois disso, você pode usar o parâmetro $ kernelProjectDir em qualquer controlador OU serviço. Assim como

class SomeControllerOrService
{
    public function someAction(...., $kernelProjectDir)
    {
          .....
Andrew Zhilin
fonte