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

3 minutos de lectura

avatar de usuario
David Ohia

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

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

services:

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

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

  • tu solución es la mejor

    – Inoryy

    10 de febrero de 2012 a las 8:34

  • estás mezclando un servicio y un controlador yo

    – John Smith

    9 mayo 2014 a las 18:51

  • Nuevamente para uso de Symfony 3.3 y en adelante %kernel.project_dir% para llegar a la raíz de su proyecto.

    –Muzafar Alí

    21 de agosto de 2017 a las 2:56

  • asegúrese de encapsular los literales entre comillas: ["%kernel.root_dir%"]

    – ochitos

    13 de septiembre de 2017 a las 7:55


avatar de usuario
Jovan Perovic

ACTUALIZACIÓN 2018-10-21:

A partir de esta semana, getRootDir() estaba en desuso. Por favor use getProjectDir() en cambio, como se sugiere en la sección de comentarios de Muzaraf Ali.

—-

Utilizar este:

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

Y si quieres el web raíz:

$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 núcleo como argumento… pero esto también funcionará…

  • +1 pero no exacto para symfony2. Utilice en su lugar: $this->get('kernel')->getRootDir() . '/../..' . $this->getRequest()->getBasePath();

    – Sebastián

    26 de agosto de 2013 a las 6:12

  • Esta solución solo es adecuada para los controladores. Aquí el tema es de servicios. De todos modos, ¿por qué pasar el entero contenedor solo para obtener una variable? Es mucho mejor pasar solo %kernel.root_dir%

    – Massimiliano Arione

    10 de septiembre de 2013 a las 9:06


  • Massimiliano tiene razón, y como complemento, uso $this->container->getParameter('kernel.cache_dir') en controladores en lugar de la solución que proporcionó

    – lacovic10

    11/09/2014 a las 20:17


  • Esto fue más sobre el tema de su servicio teniendo container inyectado 🙂 Si sigue las mejores prácticas, inyectar el container debe evitarse a toda costa. En cuanto a la solución de obtener web directorio, todavía uso el que proporcioné arriba;)

    – Jovan Perović

    18 de abril de 2016 a las 10:19

  • A partir de Symfony 3.3 y en adelante, utilice %kernel.project_dir%/web/ en vez de %kernel.root_dir%/../web/

    –Muzafar Alí

    21 de agosto de 2017 a las 2:53

En Symfony 3.3 puedes usar

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

para obtener la raíz web/proyecto.

avatar de usuario
Maugan Ra

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 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.

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;

avatar de usuario
andres zhilin

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)
    {
          .....

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad