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 originalimports:
- { 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:
Código config_prod.yml:
Ver originalimports:
- { 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 originalservices:
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;
$nformatos = count($formatos);
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