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:
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.You have requested a non-existent service "plate.zone.recognition" 500 Internal Server Error - ServiceNotFoundException
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
imports: - { resource: config.yml } framework: router: resource: "%kernel.root_dir%/config/routing_dev.yml" strict_requirements: true profiler: { only_exceptions: false } web_profiler: toolbar: true intercept_redirects: false monolog: handlers: main: type: stream path: "%kernel.logs_dir%/%kernel.environment%.log" level: debug console: type: console bubble: false # uncomment to get logging in your browser # you may have to allow bigger header sizes in your Web server configuration #firephp: # type: firephp # level: info #chromephp: # type: chromephp # level: info assetic: use_controller: true #swiftmailer: # delivery_address: [email protected]
Código config_prod.yml:
Ver original
imports: - { resource: config.yml } #framework: # validation: # cache: apc #doctrine: # orm: # metadata_cache_driver: apc # result_cache_driver: apc # query_cache_driver: apc monolog: handlers: main: type: fingers_crossed action_level: error handler: nested nested: type: stream path: "%kernel.logs_dir%/%kernel.environment%.log" level: debug console: type: console
Código PlateZoneRecognitionExtension.php:
Ver original
<?php namespace Mirame\PlateZoneRecognitionBundle\DependencyInjection; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\Config\FileLocator; use Symfony\Component\HttpKernel\DependencyInjection\Extension; use Symfony\Component\DependencyInjection\Loader; /** * This is the class that loads and manages your bundle configuration * * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html} */ class PlateZoneRecognitionExtension extends Extension { /** * {@inheritdoc} */ public function load(array $configs, ContainerBuilder $container) { $configuration = new Configuration(); $config = $this->processConfiguration($configuration, $configs); $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); $loader->load('services.yml'); } } ?>
Código services.yml:
Ver original
services: plate.zone.recognition: class: Mirame\PlateZoneRecognitionBundle\Services\Matriculas arguments: ["un argumento"]
Código PHP:
Ver original
<?php //Mirame/PlateZoneRecognitionBundle/Services/Matriculas.php namespace Mirame\PlateZoneRecognitionBundle\Services; class Matriculas { private $plate; public function __construct($mailer) { } public function validate($plate) { $retorno = false; $this->plate = $plate; if($this->validateSpanishFormat()) { $retorno = "Española"; } else if($this->validateFrenchFormat()) { $retorno = "Otra"; } return $retorno; } private function validateSpanishFormat() { $formatos = array( "/^[Hh]{0,1}\d{4}[\D|0]{3}$/", // Matriculas modernas, desde 2001 /^[Hh]{0,1}\d{4}[\D\w]{3}$/ "/^[\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}$/ "/^[\D|0]{1,2}\d{5,6}$/"); /* * Matriculas antiguas, hasta 1971, no contempla la peculiaridad de que haya 3 * letras en lugar de dos y no valida matriculas demasiado antiguas (< XX-10000) */ return $this->passValidation($formatos); } private function passValidation($formatos) { $retorno = false; for($i=0;$i<$nformatos;$i++) { $retorno = true; $i = $nformatos; } } return $retorno; } }
Código PHP:
Ver original
<?php //Mirame/PlateZoneRecognitionBundle/Controller/DefaultController.php namespace Mirame\PlateZoneRecognitionBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Response; class DefaultController extends Controller { public function indexAction($plate) { $plateRecog = $this->get('plate.zone.recognition'); return new Response($plateRecog->validate($plate)); } } ?>
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