Saltar al contenido

Symfony 4, obtenga la ruta raíz del proyecto desde una clase personalizada (no una clase de controlador)

Si encuentras algún fallo en tu código o proyecto, recuerda probar siempre en un entorno de testing antes aplicar el código al proyecto final.

Solución:

En Symfony AppKernel la clase está manejando el directorio raíz del proyecto bajo el método getProjectDir(). Para obtenerlo en el controlador puedes hacer:

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

le devolverá un directorio raíz del proyecto.

Si necesita el directorio raíz del proyecto en una de sus clases, tiene dos opciones que le presentaré. primero es pasar AppKernel como dependencia:

class Foo 

    /** KernelInterface $appKernel */
    private $appKernel;

    public function __construct(KernelInterface $appKernel)
    
        $this->appKernel = $appKernel;
    

Gracias a las dependencias de cableado automático de Symfony 4, se inyectará automáticamente en tu clase y podrás acceder a ella haciendo lo siguiente:

$this->appKernel->getProjectDir();

Pero Note por favor: No creo que sea una buena idea, hasta que tengas una necesidad real y más que ver con AppKernel class que obtener el directorio raíz del proyecto. Especialmente si piensas más adelante en crear pruebas unitarias para tu clase. Aumentaría automáticamente la complejidad al tener la necesidad de crear una simulación de AppKernel por ejemplo.

La segunda opción y en mi humilde opinión mejor sería pasar solo un string con la ruta al directorio. Puede lograr esto definiendo un servicio dentro config/services.yaml como esto:

services:
    (...)
    MyNamespaceFoo:
        arguments:
            - %kernel.project_dir%

y su constructor se vería así:

class Foo 

    /** string $rootPath */
    private $rootPath;

    public function __construct(string $rootPath)
    
        $this->rootPath = $rootPath;
    

Sin que Kernel inyección

config/services.yaml

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

….

class Foo

    private $projectDir;

    public function __construct(string $projectDir)
    
        $this->projectDir = $projectDir;
    

Si su clase se está extendiendo:SymfonyBundleFrameworkBundleControllerAbstractController, entonces puede obtener el directorio raíz como

$projectRoot = $this->getParameter('kernel.project_dir');

o

Inyectar ContainerBagInterface a su controlador

protected $projectRoot;

public function __construct(ContainerBagInterface $containerBag)

    $this->projectRoot = $containerBag->get('kernel.project_dir');;

o

Aún mejor y el enfoque recomendado.

inyectar el root_dir para usted Foo clase. Agregue lo siguiente a su configuración en servicios

services:
    foo:
        class:     AppPathToFoo
        arguments: ['%kernel.project_dir%']

El contenedor debe pasar el argumento a su clase al resolver, el Foo la clase debería verse así

projectDir = $projectDir;
  

Al final de todo puedes encontrar las interpretaciones de otros administradores, tú asimismo tienes el poder dejar el tuyo si te gusta.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *