Foros del Web » Programando para Internet » PHP » Symfony »

[SOLUCIONADO] Error con un servicio en dev que funciona perfectamente en prod

Estas en el tema de Error con un servicio en dev que funciona perfectamente en prod en el foro de Symfony en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 26/09/2014, 08:31
 
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
  #2 (permalink)  
Antiguo 26/09/2014, 09:54
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Error con un servicio en dev que funciona perfectamente en prod

No estas importando el service.yml de bundle en el config.yml de desarrollo.
Revisa el config.yml de producción la sección imports la cual debe de tener algo similar a esto:
Código yml:
Ver original
  1. imports:
  2.     - { resource: parameters.yml }
  3.     - { resource: security.yml }
  4.     - { resource: services.yml }
  5.     - { resource: @UsuarioBundle/Resources/config/services.yml}

El ultimo es un "import" para buscar en el config del bundle, debes de tener algo parecido en el de producción
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #3 (permalink)  
Antiguo 26/09/2014, 11:02
 
Fecha de Ingreso: enero-2010
Ubicación: Madrid
Mensajes: 22
Antigüedad: 14 años, 3 meses
Puntos: 0
Respuesta: Error con un servicio en dev que funciona perfectamente en prod

Gracias por tu respuesta hhs.

No era ese el problema ya que los servicios se estaban cargando mediante una extensión del inyector de dependencias de symfony o algo así (no me hagas mucho caso porque soy nuevo en symfony y en sus nomenclaturas), que cargaba automaticamente los servicios sin tener que incluir nada en los config_xxx.yml.

Era, simplemente, que symfony (por lo que sea) no se me habia instalado correctamente, a pesar de haberlo hecho desde "composer create-project" etc etc. Al final opté por reinstalar y el asunto se ha arreglado, despues de copiar todo el codigo tal y como lo tenia en la anterior instalación.

Vaya, espero que otros problemas sean mas dificiles porque casi todo el dia por una mala instalación...

SOLUCIONADO

Etiquetas: dev, servicio
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:56.