¿Cómo obtener el directorio raíz de la aplicación Symfony2?

121

¿Cuál es la mejor manera de obtener el directorio raíz de la aplicación desde el controlador? ¿Es posible sacarlo del controlador?

Ahora lo obtengo pasándolo (de parámetros) al servicio como argumento, así:

services:

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

¿Existe una manera mejor y más simple de obtener esta información en Symfony2?

Dawid Ohia
fuente
13
su solución es la mejor
Inoryy
44
estás mezclando un servicio y un controlador yo
john Smith
44
Nuevamente para Symfony 3.3 y en adelante, use %kernel.project_dir%para llegar a la raíz de su proyecto.
Muzafar Ali
1
asegúrese de encapsular literales entre comillas: ["%kernel.root_dir%"]
ochitos

Respuestas:

220

ACTUALIZACIÓN 2018-10-21:

A partir de esta semana, getRootDir()quedó en desuso. En su getProjectDir()lugar, utilícelo , como se sugiere en la sección de comentarios de Muzaraf Ali.

—-

Utilizar este:

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

Y si quieres la raíz web :

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

esto funcionará desde el método de acción del controlador ...

EDITAR: En cuanto a los servicios, creo que la forma en que lo hizo es lo más limpia posible, aunque pasaría el servicio completo del kernel como argumento ... pero esto también hará el truco ...

Jovan Perovic
fuente
3
+1 pero no es preciso para Symfony2. Utilice en su lugar:$this->get('kernel')->getRootDir() . '/../..' . $this->getRequest()->getBasePath();
Sebastian
36
Esta solución solo es adecuada para los controladores. Aquí el problema es sobre los servicios. De todos modos, ¿por qué pasar todo el contenedor solo para obtener una variable? Es mucho mejor pasar solo% kernel.root_dir%
Massimiliano Arione
2
Massimiliano es correcto, y como complemento, lo uso $this->container->getParameter('kernel.cache_dir')en los controladores en lugar de la solución que ya ha proporcionado
lackovic10
2
Esto fue más sobre el tema de la containerinyección de su servicio :) Si sigue las mejores prácticas, containerdebe evitarse la inyección a toda costa. En cuanto a la solución de obtener el webdirectorio, todavía uso el que proporcioné anteriormente;)
Jovan Perovic
44
A partir de Symfony 3.3 y uso posterior en %kernel.project_dir%/web/lugar de%kernel.root_dir%/../web/
Muzafar Ali
15

En Symfony 3.3 puedes usar

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

para obtener la raíz web / proyecto.

Chris
fuente
8

Si está utilizando esta ruta para acceder a partes de los proyectos que no son código (por ejemplo, un directorio de carga o una base de datos SQLite), entonces podría ser mejor convertir la ruta en un parámetro, como este:

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

Este parámetro se puede inyectar en cualquier lugar donde lo necesite, por lo que ya no tiene que perder el tiempo con las rutas en su código. Además, el parámetro se puede anular en el momento de la implementación. Finalmente, cada programador de mantenimiento tendrá una mejor idea de para qué lo está utilizando.

Actualización: Se corrigió el uso constante de kernel.root_dir.

MauganRa
fuente
6

También puede usar expresiones regulares además de esto:

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

Desde Symfony 3.3 puedes usar enlaces, como

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

Después de eso, puede usar el parámetro $ kernelProjectDir en cualquier controlador O servicio. Al igual que

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