Ver Mensaje Individual
  #1 (permalink)  
Antiguo 26/09/2014, 08:31
Dragown
 
Fecha de Ingreso: enero-2010
Ubicación: Madrid
Mensajes: 22
Antigüedad: 14 años, 3 meses
Puntos: 0
Error con un servicio en dev que funciona perfectamente en prod

Hola buenas a todos.

Recién acabo de empezar con Symfony y la verdad no está siendo fácil.

Tengo un problema que me ha ocupado toda la mañana y me tiene desesperado.

El caso es que estoy tratando de definir un servicio, para ir probando un servicio que determine de que país es una matricula, servicio que necesitaré en varios Bundles de la aplicación.

El caso es, después de toda una mañana rabiando porque no se registraba mi servicio, observo como resulta que en el entorno de producción si se muestra mi servicio, retornando el país del que es (o cree que es) la matricula.

Pero en el entorno de desarrollo se muestra un mensaje de error:
Código:
You have requested a non-existent service "plate.zone.recognition"
500 Internal Server Error - ServiceNotFoundException
En cambio en el entorno de producción (donde sería mas normal que no se mostrara algo que si se muestra en el entorno de dev), se muestra el resultado.

El servicio se carga mediante una extensión del contenedor (inyector de dependencias) que el comando create:bundle ha creado automaticamente, el cual carga un services.yml que es el que yo he configurado añadiendo un servicio.

Os muestro todo el codigo:

Código config_dev.yml:
Ver original
  1. imports:
  2.     - { resource: config.yml }
  3.  
  4. framework:
  5.     router:
  6.         resource: "%kernel.root_dir%/config/routing_dev.yml"
  7.         strict_requirements: true
  8.     profiler: { only_exceptions: false }
  9.  
  10. web_profiler:
  11.     toolbar: true
  12.     intercept_redirects: false
  13.  
  14. monolog:
  15.     handlers:
  16.         main:
  17.             type:   stream
  18.             path:   "%kernel.logs_dir%/%kernel.environment%.log"
  19.             level:  debug
  20.         console:
  21.             type:   console
  22.             bubble: false
  23.         # uncomment to get logging in your browser
  24.         # you may have to allow bigger header sizes in your Web server configuration
  25.         #firephp:
  26.         #    type:   firephp
  27.         #    level:  info
  28.         #chromephp:
  29.         #    type:   chromephp
  30.         #    level:  info
  31.  
  32. assetic:
  33.     use_controller: true
  34.  
  35. #swiftmailer:
  36. #    delivery_address: [email protected]

Código config_prod.yml:
Ver original
  1. imports:
  2.     - { resource: config.yml }
  3.  
  4. #framework:
  5. #    validation:
  6. #        cache: apc
  7.  
  8. #doctrine:
  9. #    orm:
  10. #        metadata_cache_driver: apc
  11. #        result_cache_driver: apc
  12. #        query_cache_driver: apc
  13.  
  14. monolog:
  15.     handlers:
  16.         main:
  17.             type:         fingers_crossed
  18.             action_level: error
  19.             handler:      nested
  20.         nested:
  21.             type:  stream
  22.             path:  "%kernel.logs_dir%/%kernel.environment%.log"
  23.             level: debug
  24.         console:
  25.             type:  console

Código PlateZoneRecognitionExtension.php:
Ver original
  1. <?php
  2.  
  3. namespace Mirame\PlateZoneRecognitionBundle\DependencyInjection;
  4.  
  5. use Symfony\Component\DependencyInjection\ContainerBuilder;
  6. use Symfony\Component\Config\FileLocator;
  7. use Symfony\Component\HttpKernel\DependencyInjection\Extension;
  8. use Symfony\Component\DependencyInjection\Loader;
  9.  
  10. /**
  11.  * This is the class that loads and manages your bundle configuration
  12.  *
  13.  * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html}
  14.  */
  15. class PlateZoneRecognitionExtension extends Extension
  16. {
  17.     /**
  18.      * {@inheritdoc}
  19.      */
  20.     public function load(array $configs, ContainerBuilder $container)
  21.     {
  22.         $configuration = new Configuration();
  23.         $config = $this->processConfiguration($configuration, $configs);
  24.  
  25.         $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
  26.         $loader->load('services.yml');
  27.     }
  28. }
  29. ?>

Código services.yml:
Ver original
  1. services:
  2.     plate.zone.recognition:
  3.         class: Mirame\PlateZoneRecognitionBundle\Services\Matriculas
  4.         arguments: ["un argumento"]
Código PHP:
Ver original
  1. <?php
  2. //Mirame/PlateZoneRecognitionBundle/Services/Matriculas.php
  3. namespace Mirame\PlateZoneRecognitionBundle\Services;
  4.  
  5. class Matriculas {
  6.     private $plate;
  7.    
  8.     public function __construct($mailer) {
  9.        
  10.     }
  11.    
  12.     public function validate($plate) {
  13.         $retorno = false;
  14.         $plate = trim($plate);
  15.         $plate = strtoupper($plate);       
  16.         $this->plate = $plate;
  17.        
  18.         if($this->validateSpanishFormat()) {
  19.             $retorno = "Española";
  20.         } else if($this->validateFrenchFormat()) {
  21.             $retorno = "Otra";
  22.         }
  23.        
  24.         return $retorno;
  25.     }
  26.    
  27.     private function validateSpanishFormat() {
  28.         $formatos = array(  "/^[Hh]{0,1}\d{4}[\D|0]{3}$/",     // Matriculas modernas, desde 2001 /^[Hh]{0,1}\d{4}[\D\w]{3}$/
  29.                             "/^[\D|0]{1,2}\d{4}[\D|0]{1,2}$/", // Matriculas entre 1971 y 2000  /^[\D|0]{1,2}\d{4}[\D|0]{1,2}$/
  30.                             "/^[\D|0]{1,2}\d{5,6}$/");        /*
  31.                                                                * Matriculas antiguas, hasta 1971, no contempla la peculiaridad de que haya 3
  32.                                                                * letras en lugar de dos y no valida matriculas demasiado antiguas (< XX-10000)
  33.                                                                */
  34.         return $this->passValidation($formatos);               
  35.     }
  36.    
  37.     private function passValidation($formatos) {
  38.         $retorno = false;
  39.         $nformatos = count($formatos);
  40.        
  41.         for($i=0;$i<$nformatos;$i++) {
  42.             if(preg_match($formatos[$i], $this->plate)) {
  43.                 $retorno = true;
  44.                 $i = $nformatos;
  45.             }
  46.         }
  47.        
  48.         return $retorno;
  49.     }
  50. }
Código PHP:
Ver original
  1. <?php
  2.  
  3. //Mirame/PlateZoneRecognitionBundle/Controller/DefaultController.php
  4.  
  5. namespace Mirame\PlateZoneRecognitionBundle\Controller;
  6.  
  7. use Symfony\Bundle\FrameworkBundle\Controller\Controller;
  8. use Symfony\Component\HttpFoundation\Response;
  9.  
  10.  
  11. class DefaultController extends Controller
  12. {
  13.     public function indexAction($plate)
  14.     {
  15.         $plateRecog = $this->get('plate.zone.recognition');
  16.         return new Response($plateRecog->validate($plate));
  17.     }
  18. }
  19. ?>

Como podéis ver, es un pequeño código de prueba, que funciona en el entorno de producción pero no en el de desarrollo.

Es un poco pesado desarrollar en el entorno de producción por el tema de la caché y demás.

Toda la ayuda que podais prestar es agradecida. Muchas gracias a todos