Como extraer el dominio de vuestra aplicación del directorio src de Symfony

Una buena practica cuando se desarrolla un proyecto es, mantener la lógica de negocio (dominio) completamente independiente del resto de la aplicación, manteniendo lo limpio de referencias a cualquier servicio o framework y así poder utilizar tu dominio en cualquier otra aplicación de manera fácil y sin editarlo.

Pero en el caso de usar Symfony2 como framework de tus proyectos, este viene configurado para que el código este en un bundle dentro del directorio src. En el caso de que siempre uses Symfony como framework para tus proyectos no te sera ningún problema, pero si usas otros frameworks de php, es probable que utilicen otra estructura de directorios por lo que no podrás reutilizar tu dominio en estos.

Para poder configurar Symfony2 para que busque tus clases fuera del directorio src sigue los siguientes pasos:

Crea un directorio en la raíz del proyecto (normalmente yo le llamo Dominio pero le podéis poner el nombre que queráis) y añade todas tus clases pertenecientes al dominio de tu aplicación dentro de esta. No olvidéis modificar los namespaces de estas clases, como sus referencias a ellas dentro de la aplicación que las use.

Por ejemplo, tenemos este proyecto con la siguiente estructura:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
app /
bin /
Dominio/ 
├── Core 
│   └── Product.php 
├── Exceptions 
│   └── ProductException.php 
├── Factories 
│   └── ProductFactory.php 
└── Tests 
      ├── Core 
      │   └── ProductItemTest.php 
      └── Factories 
        └── ProductFactoryTest.php 
src/ 
└── ProjectTest
    └── TestBundle /
vendor/ 
web/

Esta bastante resumido pero es un ejemplo para mejor comprensión. En el podéis apreciar que el dominio esta en la raíz del proyecto sin tener ninguna referencia con el framework.

Para que Symfony pueda encontrar las clases de nuestro dominio, hemos de registrarlas en el loader.

Hay dos maneras de hacer esto, dependiendo de si las clases de vuestro dominio cumplen el estándar PSR4 o el PSR0.

Si cumple el estándar PSR4, editar el fichero /app/autoload.php añadiendo la siguiente linea antes del return.

1
$loader->addPsr4('nombre_del_dominio_usado_en_los_namespaces\\','ruta_absoluta_hasta_las_clases_del_dominio');

En el caso del ejemplo anterior:

1
$loader->addPsr4('Dominio\\', __DIR__.'/../Dominio');

Si vuestras clases cumplen el estándar PSR0 editar el fichero /app/autoload.php añadiendo la siguiente linea antes del return .

1
$loader->add('nombre_del_dominio_usado_en_los_namespaces\\','ruta_absoluta_hasta_las_clases_del_dominio');

Después edita el fichero composer.json y añade a la clave autoload el nombre del dominio y la ruta relativa desde la raíz al dominio de tu proyecto.

Si tu dominio cumple el estándar PSR4

1
2
3
4
    "autoload": {
        "psr-0": { "": "src/", "SymfonyStandard": "app/" },
        "psr-4": { "nombre_de_tu_dominio\\": "ruta_relativa_desde_la_raiz_de_tu_proyecto_al_dominio/"}
    },

En el caso del ejemplo

1
2
3
4
    "autoload": {
        "psr-0": { "": "src/", "SymfonyStandard": "app/" },
        "psr-4": { "Dominio\\": "Dominio/"}
    },

Si tu dominio cumple el estándar PSR0

1
2
3
    "autoload": {
        "psr-0": { "": "src/", "SymfonyStandard": "app/", "nombre_de_tu_dominio\\": "ruta_relativa_desde_la_raiz_de_tu_proyecto_al_dominio/"}
    },

Una vez finalizado, ejecuta composer update y una vez finalizado, tu proyecto de Symfony2 ya reconocerá tu dominio y podrás usar las clases de este en tu aplicación.

Esta configuración ha sido probada en la versión 2.6 de Symfony. Espero que os sirva de ayuda.

Deja un comentario

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