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.